@@ -675,8 +675,10 @@ def _init_reg_blocks(self):
675675 else :
676676 reg_blocks .append (rb )
677677
678- assert self .default_node in reg_blocks , \
679- "default node ({}) is invalid" .format (self .default_node )
678+ # If there are no register blocks, we don't need to validate default_node
679+ if reg_blocks :
680+ assert self .default_node in reg_blocks , \
681+ "default node ({}) is invalid" .format (self .default_node )
680682
681683 self .reg_block_enum = self ._enum_type (
682684 Name ([]), Name (["dt" ]) + self .ip_name + Name (["reg" , "block" ]))
@@ -881,6 +883,9 @@ def _init_instances(self):
881883 self .inst_enum .add_first_constant ("First instance" )
882884 self .inst_enum .add_count_constant ("Number of instances" )
883885
886+ def has_reg_blocks (self ):
887+ return len (self .ip .reg_blocks ) > 0
888+
884889 def has_features (self ):
885890 return len (self .ip .features ) > 0
886891
@@ -897,15 +902,16 @@ def _create_dt_struct(self):
897902 field_type = ScalarType (TopHelper .DT_INSTANCE_ID_NAME ),
898903 docstring = "Instance ID"
899904 )
900- self .inst_struct .add_field (
901- name = self .REG_BLOCK_ADDR_FIELD_NAME ,
902- field_type = ArrayMapType (
903- elem_type = ScalarType ("uint32_t" ),
904- index_type = ScalarType (self .reg_block_enum .name ),
905- length = Name (["count" ]),
906- ),
907- docstring = "Base address of each register block"
908- )
905+ if self .has_reg_blocks ():
906+ self .inst_struct .add_field (
907+ name = self .REG_BLOCK_ADDR_FIELD_NAME ,
908+ field_type = ArrayMapType (
909+ elem_type = ScalarType ("uint32_t" ),
910+ index_type = ScalarType (self .reg_block_enum .name ),
911+ length = Name (["count" ]),
912+ ),
913+ docstring = "Base address of each register block"
914+ )
909915 self .inst_struct .add_field (
910916 name = self .MEM_ADDR_FIELD_NAME ,
911917 field_type = ArrayMapType (
@@ -997,19 +1003,20 @@ def _create_instance(self, m):
9971003 # Instance ID.
9981004 inst_desc [self .INST_ID_FIELD_NAME ] = Name .from_snake_case (modname )
9991005 # Reg block address map.
1000- reg_block_map = OrderedDict ()
1001- for rb in self .ip .reg_blocks .keys ():
1002- rb_key = rb
1003- if rb is None :
1004- rb = self .UNNAMED_REG_BLOCK_NAME
1005- rb_key = "null" # Due to json serializing, None appears as null.
1006- rb = Name .from_snake_case (rb )
1007- # It is possible that this module is not accessible in this
1008- # address space. In this case, return a dummy value.
1009- # FIXME Maybe find a better way of doing this.
1010- assert rb_key in m ["base_addrs" ]
1011- reg_block_map [rb ] = m ["base_addrs" ][rb_key ].get (self ._addr_space , "0xffffffff" )
1012- inst_desc [self .REG_BLOCK_ADDR_FIELD_NAME ] = reg_block_map
1006+ if self .has_reg_blocks ():
1007+ reg_block_map = OrderedDict ()
1008+ for rb in self .ip .reg_blocks .keys ():
1009+ rb_key = rb
1010+ if rb is None :
1011+ rb = self .UNNAMED_REG_BLOCK_NAME
1012+ rb_key = "null" # Due to json serializing, None appears as null.
1013+ rb = Name .from_snake_case (rb )
1014+ # It is possible that this module is not accessible in this
1015+ # address space. In this case, return a dummy value.
1016+ # FIXME Maybe find a better way of doing this.
1017+ assert rb_key in m ["base_addrs" ]
1018+ reg_block_map [rb ] = m ["base_addrs" ][rb_key ].get (self ._addr_space , "0xffffffff" )
1019+ inst_desc [self .REG_BLOCK_ADDR_FIELD_NAME ] = reg_block_map
10131020 # Memories.
10141021 mem_addr_map = OrderedDict ()
10151022 mem_size_map = OrderedDict ()
0 commit comments