@@ -170,7 +170,7 @@ def __init__(self):
170
170
self .submodules = _ModuleBuilderSubmodules (self )
171
171
self .domains = _ModuleBuilderDomainSet (self )
172
172
173
- self ._statements = Statement . cast ([])
173
+ self ._statements = {}
174
174
self ._ctrl_context = None
175
175
self ._ctrl_stack = []
176
176
@@ -234,7 +234,7 @@ def If(self, cond):
234
234
"src_locs" : [],
235
235
})
236
236
try :
237
- _outer_case , self ._statements = self ._statements , []
237
+ _outer_case , self ._statements = self ._statements , {}
238
238
self .domain ._depth += 1
239
239
yield
240
240
self ._flush_ctrl ()
@@ -254,7 +254,7 @@ def Elif(self, cond):
254
254
if if_data is None or if_data ["depth" ] != self .domain ._depth :
255
255
raise SyntaxError ("Elif without preceding If" )
256
256
try :
257
- _outer_case , self ._statements = self ._statements , []
257
+ _outer_case , self ._statements = self ._statements , {}
258
258
self .domain ._depth += 1
259
259
yield
260
260
self ._flush_ctrl ()
@@ -273,7 +273,7 @@ def Else(self):
273
273
if if_data is None or if_data ["depth" ] != self .domain ._depth :
274
274
raise SyntaxError ("Else without preceding If/Elif" )
275
275
try :
276
- _outer_case , self ._statements = self ._statements , []
276
+ _outer_case , self ._statements = self ._statements , {}
277
277
self .domain ._depth += 1
278
278
yield
279
279
self ._flush_ctrl ()
@@ -341,7 +341,7 @@ def Case(self, *patterns):
341
341
continue
342
342
new_patterns = (* new_patterns , pattern .value )
343
343
try :
344
- _outer_case , self ._statements = self ._statements , []
344
+ _outer_case , self ._statements = self ._statements , {}
345
345
self ._ctrl_context = None
346
346
yield
347
347
self ._flush_ctrl ()
@@ -364,7 +364,7 @@ def Default(self):
364
364
warnings .warn ("A case defined after the default case will never be active" ,
365
365
SyntaxWarning , stacklevel = 3 )
366
366
try :
367
- _outer_case , self ._statements = self ._statements , []
367
+ _outer_case , self ._statements = self ._statements , {}
368
368
self ._ctrl_context = None
369
369
yield
370
370
self ._flush_ctrl ()
@@ -416,7 +416,7 @@ def State(self, name):
416
416
if name not in fsm_data ["encoding" ]:
417
417
fsm_data ["encoding" ][name ] = len (fsm_data ["encoding" ])
418
418
try :
419
- _outer_case , self ._statements = self ._statements , []
419
+ _outer_case , self ._statements = self ._statements , {}
420
420
self ._ctrl_context = None
421
421
yield
422
422
self ._flush_ctrl ()
@@ -453,28 +453,42 @@ def _pop_ctrl(self):
453
453
if_tests , if_bodies = data ["tests" ], data ["bodies" ]
454
454
if_src_locs = data ["src_locs" ]
455
455
456
- tests , cases = [], OrderedDict ()
457
- for if_test , if_case in zip (if_tests + [None ], if_bodies ):
458
- if if_test is not None :
459
- if len (if_test ) != 1 :
460
- if_test = if_test .bool ()
461
- tests .append (if_test )
456
+ domains = set ()
457
+ for if_case in if_bodies :
458
+ domains |= set (if_case )
462
459
463
- if if_test is not None :
464
- match = ("1" + "-" * (len (tests ) - 1 )).rjust (len (if_tests ), "-" )
465
- else :
466
- match = None
467
- cases [match ] = if_case
460
+ for domain in domains :
461
+ tests , cases = [], OrderedDict ()
462
+ for if_test , if_case in zip (if_tests + [None ], if_bodies ):
463
+ if if_test is not None :
464
+ if len (if_test ) != 1 :
465
+ if_test = if_test .bool ()
466
+ tests .append (if_test )
468
467
469
- self ._statements .append (Switch (Cat (tests ), cases ,
470
- src_loc = src_loc , case_src_locs = dict (zip (cases , if_src_locs ))))
468
+ if if_test is not None :
469
+ match = ("1" + "-" * (len (tests ) - 1 )).rjust (len (if_tests ), "-" )
470
+ else :
471
+ match = None
472
+ cases [match ] = if_case .get (domain , [])
473
+
474
+ self ._statements .setdefault (domain , []).append (Switch (Cat (tests ), cases ,
475
+ src_loc = src_loc , case_src_locs = dict (zip (cases , if_src_locs ))))
471
476
472
477
if name == "Switch" :
473
478
switch_test , switch_cases = data ["test" ], data ["cases" ]
474
479
switch_case_src_locs = data ["case_src_locs" ]
475
480
476
- self ._statements .append (Switch (switch_test , switch_cases ,
477
- src_loc = src_loc , case_src_locs = switch_case_src_locs ))
481
+ domains = set ()
482
+ for stmts in switch_cases .values ():
483
+ domains |= set (stmts )
484
+
485
+ for domain in domains :
486
+ domain_cases = OrderedDict ()
487
+ for patterns , stmts in switch_cases .items ():
488
+ domain_cases [patterns ] = stmts .get (domain , [])
489
+
490
+ self ._statements .setdefault (domain , []).append (Switch (switch_test , domain_cases ,
491
+ src_loc = src_loc , case_src_locs = switch_case_src_locs ))
478
492
479
493
if name == "FSM" :
480
494
fsm_signal , fsm_reset , fsm_encoding , fsm_decoding , fsm_states = \
@@ -490,10 +504,20 @@ def _pop_ctrl(self):
490
504
# The FSM is encoded such that the state with encoding 0 is always the reset state.
491
505
fsm_decoding .update ((n , s ) for s , n in fsm_encoding .items ())
492
506
fsm_signal .decoder = lambda n : f"{ fsm_decoding [n ]} /{ n } "
493
- self ._statements .append (Switch (fsm_signal ,
494
- OrderedDict ((fsm_encoding [name ], stmts ) for name , stmts in fsm_states .items ()),
495
- src_loc = src_loc , case_src_locs = {fsm_encoding [name ]: fsm_state_src_locs [name ]
496
- for name in fsm_states }))
507
+
508
+ domains = set ()
509
+ for stmts in fsm_states .values ():
510
+ domains |= set (stmts )
511
+
512
+ for domain in domains :
513
+ domain_states = OrderedDict ()
514
+ for state , stmts in fsm_states .items ():
515
+ domain_states [state ] = stmts .get (domain , [])
516
+
517
+ self ._statements .setdefault (domain , []).append (Switch (fsm_signal ,
518
+ OrderedDict ((fsm_encoding [name ], stmts ) for name , stmts in domain_states .items ()),
519
+ src_loc = src_loc , case_src_locs = {fsm_encoding [name ]: fsm_state_src_locs [name ]
520
+ for name in fsm_states }))
497
521
498
522
def _add_statement (self , assigns , domain , depth ):
499
523
def domain_name (domain ):
@@ -523,7 +547,7 @@ def domain_name(domain):
523
547
"already driven from d.{}"
524
548
.format (signal , domain_name (domain ), domain_name (cd_curr )))
525
549
526
- self ._statements .append (stmt )
550
+ self ._statements .setdefault ( domain , []). append (stmt )
527
551
528
552
def _add_submodule (self , submodule , name = None ):
529
553
if not hasattr (submodule , "elaborate" ):
@@ -559,7 +583,8 @@ def elaborate(self, platform):
559
583
fragment .add_subfragment (Fragment .get (self ._named_submodules [name ], platform ), name )
560
584
for submodule in self ._anon_submodules :
561
585
fragment .add_subfragment (Fragment .get (submodule , platform ), None )
562
- fragment .add_statements (self ._statements )
586
+ for domain , statements in self ._statements .items ():
587
+ fragment .add_statements (domain , statements )
563
588
for signal , domain in self ._driving .items ():
564
589
fragment .add_driver (signal , domain )
565
590
fragment .add_domains (self ._domains .values ())
0 commit comments