@@ -690,7 +690,7 @@ def emit_value(self, builder):
690690
691691
692692class NetlistEmitter :
693- def __init__ (self , netlist : _nir .Netlist , design , * , all_undef_to_ff = False ):
693+ def __init__ (self , netlist : _nir .Netlist , design : Design , * , all_undef_to_ff = False ):
694694 self .netlist = netlist
695695 self .design = design
696696 self .all_undef_to_ff = all_undef_to_ff
@@ -776,7 +776,7 @@ def extend(self, value: _nir.Value, signed: bool, width: int):
776776 def emit_operator (self , module_idx : int , operator : str , * inputs : _nir .Value , src_loc ):
777777 op = _nir .Operator (module_idx , operator = operator , inputs = inputs , src_loc = src_loc )
778778 return self .netlist .add_value_cell (op .width , op )
779-
779+
780780 def emit_matches (self , module_idx : int , value : _nir .Value , patterns , * , src_loc ):
781781 key = module_idx , value , patterns , src_loc
782782 try :
@@ -1334,6 +1334,42 @@ def emit_top_ports(self, fragment: _ir.Fragment):
13341334 else :
13351335 raise ValueError (f"Invalid port direction { dir !r} " )
13361336
1337+ def emit_signal_fields (self ):
1338+ for signal , fragment in self .design .signal_lca .items ():
1339+ module_idx = self .fragment_module_idx [fragment ]
1340+ fields = {}
1341+ def emit_format (path , fmt ):
1342+ if isinstance (fmt , _ast .Format ):
1343+ specs = [
1344+ chunk [0 ]
1345+ for chunk in fmt ._chunks
1346+ if not isinstance (chunk , str )
1347+ ]
1348+ if len (specs ) != 1 :
1349+ return
1350+ val , signed = self .emit_rhs (module_idx , specs [0 ])
1351+ fields [path ] = _nir .SignalField (val , signed = signed )
1352+ elif isinstance (fmt , _ast .Format .Enum ):
1353+ val , signed = self .emit_rhs (module_idx , fmt ._value )
1354+ fields [path ] = _nir .SignalField (val , signed = signed ,
1355+ enum_name = fmt ._name ,
1356+ enum_variants = fmt ._variants )
1357+ elif isinstance (fmt , _ast .Format .Struct ):
1358+ val , signed = self .emit_rhs (module_idx , fmt ._value )
1359+ fields [path ] = _nir .SignalField (val , signed = signed )
1360+ for name , subfmt in fmt ._fields .items ():
1361+ emit_format (path + (name ,), subfmt )
1362+ elif isinstance (fmt , _ast .Format .Array ):
1363+ val , signed = self .emit_rhs (module_idx , fmt ._value )
1364+ fields [path ] = _nir .SignalField (val , signed = signed )
1365+ for idx , subfmt in enumerate (fmt ._fields ):
1366+ emit_format (path + (idx ,), subfmt )
1367+ emit_format ((), signal ._format )
1368+ val , signed = self .emit_rhs (module_idx , signal )
1369+ if () not in fields or fields [()].value != val :
1370+ fields [()] = _nir .SignalField (val , signed = signed )
1371+ self .netlist .signal_fields [signal ] = fields
1372+
13371373 def emit_drivers (self ):
13381374 for driver in self .drivers .values ():
13391375 if (driver .domain is not None and
@@ -1452,6 +1488,7 @@ def emit_fragment(self, fragment: _ir.Fragment, parent_module_idx: 'int | None',
14521488 for subfragment , _name , sub_src_loc in fragment .subfragments :
14531489 self .emit_fragment (subfragment , module_idx , cell_src_loc = sub_src_loc )
14541490 if parent_module_idx is None :
1491+ self .emit_signal_fields ()
14551492 self .emit_drivers ()
14561493 self .emit_top_ports (fragment )
14571494 if self .all_undef_to_ff :
0 commit comments