@@ -163,6 +163,23 @@ def find_processes(proc: AbstractProcess,
163
163
return seen_procs
164
164
165
165
166
+ def annotate_folded_view (proc_list : ty .List [AbstractProcess ],
167
+ folded_procs : ty .List [str ] = None ):
168
+ """Annotate folded views and propagate them recursively
169
+ """
170
+ annotated : ty .Set (AbstractProcess ) = set ()
171
+ fv_inst_id : int = 0
172
+ for p in proc_list :
173
+ if p .__class__ .__name__ in folded_procs :
174
+ p .folded_view = p .__class__
175
+ p .folded_view_inst_id = fv_inst_id
176
+ fv_inst_id += 1
177
+ annotated .add (p )
178
+
179
+ for p in annotated :
180
+ p .propagate_folded_views ()
181
+
182
+
166
183
class DiGraphBase (ntx .DiGraph ):
167
184
"""Base class for directed graphs in the compiler.
168
185
@@ -600,26 +617,36 @@ class ProcGroupDiGraphs(AbstractProcGroupDiGraphs):
600
617
sorted order of nodes.
601
618
"""
602
619
603
- def __init__ (self , proc : AbstractProcess , run_cfg : RunConfig ):
620
+ def __init__ (self , proc : AbstractProcess , run_cfg : RunConfig ,
621
+ compile_config : ty .Optional [ty .Dict [str , ty .Any ]] = None ):
604
622
605
623
self ._base_proc = proc # Process on which compile/run was called
606
624
self ._run_cfg = run_cfg
625
+ self ._compile_config = compile_config
607
626
# 1. Find all Processes
608
627
proc_list = find_processes (proc )
628
+
609
629
# Check if any Process in proc_list is already compiled
610
630
for p in proc_list :
611
631
if p .is_compiled :
612
632
raise ex .ProcessAlreadyCompiled (p )
613
633
p ._is_compiled = True
634
+
614
635
# Number of Processes before resolving HierarchicalProcesses
615
636
self ._num_procs_pre_pm_discovery = len (proc_list )
616
637
# 2. Generate a ProcessGraph: This does not resolve
617
638
# HierarchicalProcesses yet, because we have not discovered
618
639
# ProcessModels
619
640
self ._raw_proc_digraph = ProcDiGraph (proc_list = proc_list )
620
641
# 3. Find and select ProcessModels based on RunConfig:
642
+ elab_procs = []
621
643
proc_procmodel_map = ProcGroupDiGraphs ._map_proc_to_model (proc_list ,
622
- self ._run_cfg )
644
+ self ._run_cfg ,
645
+ elab_procs )
646
+ if self ._compile_config and 'folded_view' in self ._compile_config :
647
+ folded_views = self ._compile_config ["folded_view" ]
648
+ annotate_folded_view (elab_procs , folded_views )
649
+
623
650
# Assign ProcessModels to Processes
624
651
for p , pm in proc_procmodel_map .items ():
625
652
p ._model_class = pm
@@ -939,7 +966,8 @@ def _propagate_var_ports(proc: AbstractProcess):
939
966
940
967
@staticmethod
941
968
def _expand_sub_proc_model (model_cls : ty .Type [AbstractSubProcessModel ],
942
- proc : AbstractProcess , run_cfg : RunConfig ):
969
+ proc : AbstractProcess , run_cfg : RunConfig ,
970
+ elab_procs : ty .List [AbstractProcess ]):
943
971
"""Expand a SubProcessModel by building it, extracting the
944
972
sub-Processes contained within, and mapping the sub-Processes
945
973
recursively to their ProcessModels.
@@ -969,11 +997,13 @@ def _expand_sub_proc_model(model_cls: ty.Type[AbstractSubProcessModel],
969
997
proc .validate_var_aliases ()
970
998
# Recursively map sub processes to their ProcModel
971
999
return ProcGroupDiGraphs ._map_proc_to_model (list (sub_procs .values ()),
972
- run_cfg )
1000
+ run_cfg ,
1001
+ elab_procs )
973
1002
974
1003
@staticmethod
975
1004
def _map_proc_to_model (procs : ty .List [AbstractProcess ],
976
- run_cfg : RunConfig ) -> ProcMap :
1005
+ run_cfg : RunConfig ,
1006
+ elab_procs : ty .List [AbstractProcess ]) -> ProcMap :
977
1007
"""Associate each Process in a list of Processes to the corresponding
978
1008
ProcessModel as selected by run_cfg.
979
1009
@@ -1006,17 +1036,20 @@ def _map_proc_to_model(procs: ty.List[AbstractProcess],
1006
1036
model_cls = ProcGroupDiGraphs ._select_proc_models (proc ,
1007
1037
models_cls ,
1008
1038
run_cfg )
1009
- if issubclass (model_cls , AbstractSubProcessModel ):
1039
+ if model_cls and issubclass (model_cls , AbstractSubProcessModel ):
1010
1040
# Recursively substitute SubProcModel by sub processes
1011
1041
sub_map = ProcGroupDiGraphs ._expand_sub_proc_model (model_cls ,
1012
1042
proc ,
1013
- run_cfg )
1043
+ run_cfg ,
1044
+ elab_procs )
1014
1045
proc_map .update (sub_map )
1015
1046
proc ._model_class = model_cls
1016
- else :
1047
+ elif model_cls :
1017
1048
# Just map current Process to selected ProcessModel
1018
1049
proc_map [proc ] = model_cls
1019
1050
1051
+ elab_procs .append (proc )
1052
+
1020
1053
return proc_map
1021
1054
1022
1055
def _collapse_isomodel_procs (self ) -> ProcDiGraph :
0 commit comments