Skip to content

Commit d094e69

Browse files
ymeng-gitmgkwill
andauthored
Folded view (#774)
* added the folded_view compilation option and propagated folded_views * enable folded compilation for dynamically created workloads --------- Co-authored-by: Marcus G K Williams <168222+mgkwill@users.noreply.github.com>
1 parent ca88f76 commit d094e69

File tree

3 files changed

+75
-9
lines changed

3 files changed

+75
-9
lines changed

src/lava/magma/compiler/compiler.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,9 @@ def compile(
130130
"""
131131
# Group and sort all Processes connected to 'process' into a list of
132132
# ProcGroups.
133-
proc_group_digraph = ProcGroupDiGraphs(process, run_cfg)
133+
proc_group_digraph = ProcGroupDiGraphs(process,
134+
run_cfg,
135+
self._compile_config)
134136
proc_groups: ty.List[ProcGroup] = proc_group_digraph.get_proc_groups()
135137
# Get a flattened list of all AbstractProcesses
136138
process_list = list(itertools.chain.from_iterable(proc_groups))

src/lava/magma/compiler/compiler_graphs.py

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,23 @@ def find_processes(proc: AbstractProcess,
163163
return seen_procs
164164

165165

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+
166183
class DiGraphBase(ntx.DiGraph):
167184
"""Base class for directed graphs in the compiler.
168185
@@ -600,26 +617,36 @@ class ProcGroupDiGraphs(AbstractProcGroupDiGraphs):
600617
sorted order of nodes.
601618
"""
602619

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):
604622

605623
self._base_proc = proc # Process on which compile/run was called
606624
self._run_cfg = run_cfg
625+
self._compile_config = compile_config
607626
# 1. Find all Processes
608627
proc_list = find_processes(proc)
628+
609629
# Check if any Process in proc_list is already compiled
610630
for p in proc_list:
611631
if p.is_compiled:
612632
raise ex.ProcessAlreadyCompiled(p)
613633
p._is_compiled = True
634+
614635
# Number of Processes before resolving HierarchicalProcesses
615636
self._num_procs_pre_pm_discovery = len(proc_list)
616637
# 2. Generate a ProcessGraph: This does not resolve
617638
# HierarchicalProcesses yet, because we have not discovered
618639
# ProcessModels
619640
self._raw_proc_digraph = ProcDiGraph(proc_list=proc_list)
620641
# 3. Find and select ProcessModels based on RunConfig:
642+
elab_procs = []
621643
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+
623650
# Assign ProcessModels to Processes
624651
for p, pm in proc_procmodel_map.items():
625652
p._model_class = pm
@@ -939,7 +966,8 @@ def _propagate_var_ports(proc: AbstractProcess):
939966

940967
@staticmethod
941968
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]):
943971
"""Expand a SubProcessModel by building it, extracting the
944972
sub-Processes contained within, and mapping the sub-Processes
945973
recursively to their ProcessModels.
@@ -969,11 +997,13 @@ def _expand_sub_proc_model(model_cls: ty.Type[AbstractSubProcessModel],
969997
proc.validate_var_aliases()
970998
# Recursively map sub processes to their ProcModel
971999
return ProcGroupDiGraphs._map_proc_to_model(list(sub_procs.values()),
972-
run_cfg)
1000+
run_cfg,
1001+
elab_procs)
9731002

9741003
@staticmethod
9751004
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:
9771007
"""Associate each Process in a list of Processes to the corresponding
9781008
ProcessModel as selected by run_cfg.
9791009
@@ -1006,17 +1036,20 @@ def _map_proc_to_model(procs: ty.List[AbstractProcess],
10061036
model_cls = ProcGroupDiGraphs._select_proc_models(proc,
10071037
models_cls,
10081038
run_cfg)
1009-
if issubclass(model_cls, AbstractSubProcessModel):
1039+
if model_cls and issubclass(model_cls, AbstractSubProcessModel):
10101040
# Recursively substitute SubProcModel by sub processes
10111041
sub_map = ProcGroupDiGraphs._expand_sub_proc_model(model_cls,
10121042
proc,
1013-
run_cfg)
1043+
run_cfg,
1044+
elab_procs)
10141045
proc_map.update(sub_map)
10151046
proc._model_class = model_cls
1016-
else:
1047+
elif model_cls:
10171048
# Just map current Process to selected ProcessModel
10181049
proc_map[proc] = model_cls
10191050

1051+
elab_procs.append(proc)
1052+
10201053
return proc_map
10211054

10221055
def _collapse_isomodel_procs(self) -> ProcDiGraph:

src/lava/magma/core/process/process.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,10 @@ def __init__(self, **proc_params) -> None:
211211
# Flag indicating whether process has been compiled already.
212212
self._is_compiled: bool = False
213213

214+
# folded view
215+
self._folded_view : ty.Optional[AbstractProcess] = None
216+
self._folded_view_inst_id : int = -1
217+
214218
# Current runtime environment
215219
self._runtime: ty.Optional[Runtime] = None
216220

@@ -253,6 +257,10 @@ def __init__(self, ..):
253257
self._init_proc_member_obj(attrs)
254258
self.vars.add_members(attrs)
255259

260+
attrs = self._find_attr_by_type(AbstractProcess)
261+
self._init_proc_member_obj(attrs)
262+
self.procs.add_members(attrs)
263+
256264
def _find_attr_by_type(self, cls) -> ty.Dict:
257265
"""Finds all class attributes of a certain class type."""
258266
attrs = dict()
@@ -303,6 +311,12 @@ def is_sub_proc_of(self, proc: AbstractProcess):
303311
else:
304312
return False
305313

314+
def propagate_folded_views(self):
315+
for p in self.procs:
316+
p._folded_view = self._folded_view
317+
p._folded_view_inst_id = self._folded_view_inst_id
318+
p.propagate_folded_views()
319+
306320
def run(self,
307321
condition: AbstractRunCondition,
308322
run_cfg: ty.Optional[RunConfig] = None,
@@ -444,6 +458,23 @@ def is_compiled(self):
444458
"""Returns True if process has been compiled."""
445459
return self._is_compiled
446460

461+
@property
462+
def folded_view(self) -> ty.Type["AbstractProcess"]:
463+
""" Return folded view process"""
464+
return self._folded_view
465+
466+
@folded_view.setter
467+
def folded_view(self, folded_view : ty.Optional[AbstractProcess] = None):
468+
self._folded_view = folded_view
469+
470+
@property
471+
def folded_view_inst_id(self) -> int:
472+
return self._folded_view_inst_id
473+
474+
@folded_view_inst_id.setter
475+
def folded_view_inst_id(self, inst_id : int = -1):
476+
self._folded_view_inst_id = inst_id
477+
447478

448479
class ProcessParameters:
449480
"""Wrapper around a dictionary that is used to pass parameters from a

0 commit comments

Comments
 (0)