|
3 | 3 | # SPDX-License-Identifier: Apache-2.0
|
4 | 4 | '''Code representing an IP block for reggen'''
|
5 | 5 |
|
| 6 | +import logging as log |
6 | 7 | from typing import Dict, List, Optional, Sequence, Set, Tuple
|
7 | 8 |
|
8 | 9 | import hjson # type: ignore
|
@@ -622,3 +623,40 @@ def check_cm_annotations(self, rtl_names: Dict[str, List[Tuple[str, int]]],
|
622 | 623 | return CounterMeasure.check_annotation_list(self.name, hjson_path,
|
623 | 624 | rtl_names,
|
624 | 625 | self.countermeasures)
|
| 626 | + |
| 627 | + def check_regwens(self) -> bool: |
| 628 | + """Checks all regwens are used in at least one other CSR |
| 629 | +
|
| 630 | + This relies on the regwen having the string "REGWEN" in its name. |
| 631 | + The uses should be in the "regwen" field of a CSR. |
| 632 | + """ |
| 633 | + log.debug(f"Checking regwens for IP {self.name}") |
| 634 | + status: bool = True |
| 635 | + for rb in self.reg_blocks.values(): |
| 636 | + rb_name = rb.name if rb.name else "default" |
| 637 | + log.debug(f"Register block: {rb_name}") |
| 638 | + regwen_names: List[str] = [reg.name for reg in rb.registers |
| 639 | + if "REGWEN" in reg.name] |
| 640 | + unused_regwens: List[str] = [] |
| 641 | + for regwen in regwen_names: |
| 642 | + regwen_users = [] |
| 643 | + for reg in rb.registers: |
| 644 | + if reg.regwen == regwen: |
| 645 | + regwen_users.append(reg) |
| 646 | + for multi_reg in rb.multiregs: |
| 647 | + for reg in multi_reg.regs: |
| 648 | + if reg.regwen == regwen: |
| 649 | + regwen_users.append(reg) |
| 650 | + if not regwen_users: |
| 651 | + unused_regwens.append(regwen) |
| 652 | + else: |
| 653 | + log.debug( |
| 654 | + f"Regwen {regwen} in {self.name}'s {rb_name} register " |
| 655 | + "block controls the following registers:") |
| 656 | + for r in regwen_users: |
| 657 | + log.debug(f" {r.name}") |
| 658 | + if unused_regwens: |
| 659 | + log.error(f"Unused regwen(s) in {self.name} {rb_name} " |
| 660 | + f"register block: {', '.join(unused_regwens)}") |
| 661 | + status = False |
| 662 | + return status |
0 commit comments