celox_frontend_core/symbolic/
artifact.rs1use std::{collections::BTreeSet, fmt};
2
3use celox_design::{
4 InitialStateValue, ModuleId, RegionedAbsoluteAddrBase, RegionedVarAddrBase, RuntimeErrorInfo,
5 RuntimeEventSite, TriggerSet, VariableMetadata,
6};
7use celox_sir::ExecutionUnit;
8use celox_slt::{CombObserver, FfAccessSummary, GlueBlockBase, LogicPath, SLTNodeArena};
9
10use crate::{HashMap, HashSet, SourceLocation, SourceVarId, VariableKind};
11
12pub type SymbolicRegionedAddr = RegionedVarAddrBase<SourceVarId>;
13pub type SymbolicGlueAddr = celox_slt::GlueAddrBase<SourceVarId>;
14pub type SymbolicGlueBlock = GlueBlockBase<SourceVarId>;
15
16#[derive(Clone, Debug)]
18pub struct SymbolicVariable {
19 pub path: Vec<String>,
20 pub kind: VariableKind,
21 pub signed: bool,
22 pub metadata: VariableMetadata,
23 pub packed_dims: Vec<usize>,
24 pub source: Option<SourceLocation>,
25 pub module_affiliated: bool,
26}
27
28#[derive(Clone)]
29pub struct SimModule {
30 pub name: String,
31 pub variables: HashMap<SourceVarId, SymbolicVariable>,
32 pub ff_access_summaries:
33 HashMap<TriggerSet<SourceVarId>, FfAccessSummary<SymbolicRegionedAddr>>,
34 pub eval_only_ff_blocks: HashMap<TriggerSet<SourceVarId>, ExecutionUnit<SymbolicRegionedAddr>>,
35 pub apply_ff_blocks: HashMap<TriggerSet<SourceVarId>, ExecutionUnit<SymbolicRegionedAddr>>,
36 pub eval_apply_ff_blocks: HashMap<TriggerSet<SourceVarId>, ExecutionUnit<SymbolicRegionedAddr>>,
37 pub glue_blocks: HashMap<String, Vec<SymbolicGlueBlock>>,
38 pub indexed_instance_names: HashSet<String>,
39 pub comb_blocks: Vec<LogicPath<SourceVarId>>,
40 pub comb_observers: Vec<CombObserver<SourceVarId>>,
41 pub runtime_errors: HashMap<i64, RuntimeErrorInfo<SourceVarId>>,
42 pub runtime_event_sites: Vec<RuntimeEventSite>,
43 pub initial_memory_values: Vec<InitialStateValue<SourceVarId>>,
44 pub comb_boundaries: HashMap<SourceVarId, BTreeSet<usize>>,
45 pub arena: SLTNodeArena<SourceVarId>,
46 pub reset_clock_map: HashMap<SourceVarId, SourceVarId>,
47}
48
49impl fmt::Debug for SimModule {
50 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
51 f.debug_struct("SimModule")
52 .field("name", &self.name)
53 .field("variables", &"<omitted>")
54 .field("ff_access_summaries", &self.ff_access_summaries)
55 .field("eval_only_ff_blocks", &self.eval_only_ff_blocks)
56 .field("apply_ff_blocks", &self.apply_ff_blocks)
57 .field("eval_apply_ff_blocks", &self.eval_apply_ff_blocks)
58 .field("glue_blocks", &self.glue_blocks)
59 .field("indexed_instance_names", &self.indexed_instance_names)
60 .field("comb_blocks", &self.comb_blocks)
61 .field("comb_boundaries", &self.comb_boundaries)
62 .field("arena", &self.arena)
63 .field("reset_clock_map", &self.reset_clock_map)
64 .finish()
65 }
66}
67
68#[derive(Clone)]
69pub struct ExternalModule {
70 pub sim_module: SimModule,
71 pub port_order: Vec<SourceVarId>,
72 pub unresolved_instances: Vec<String>,
73}
74
75#[derive(Clone, Default)]
76pub struct ExternalHierarchy {
77 pub modules: HashMap<ModuleId, ExternalModule>,
78 pub roots: HashMap<String, ModuleId>,
79}
80
81pub struct SymbolicRtl {
82 pub modules: HashMap<ModuleId, SimModule>,
83 pub module_names: HashMap<ModuleId, String>,
84 pub root_id: ModuleId,
85}
86
87#[derive(Clone)]
88pub struct RelocationModule {
89 pub eval_apply_ff_blocks:
90 HashMap<TriggerSet<SourceVarId>, ExecutionUnit<RegionedAbsoluteAddrBase<SourceVarId>>>,
91 pub eval_only_ff_blocks:
92 HashMap<TriggerSet<SourceVarId>, ExecutionUnit<RegionedAbsoluteAddrBase<SourceVarId>>>,
93 pub apply_ff_blocks:
94 HashMap<TriggerSet<SourceVarId>, ExecutionUnit<RegionedAbsoluteAddrBase<SourceVarId>>>,
95 pub comb_blocks: Vec<LogicPath<crate::SourceAddr>>,
96 pub comb_observers: Vec<CombObserver<crate::SourceAddr>>,
97}
98
99impl fmt::Debug for RelocationModule {
100 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
101 f.debug_struct("RelocationModule")
102 .field("eval_apply_ff_blocks", &self.eval_apply_ff_blocks)
103 .field("eval_only_ff_blocks", &self.eval_only_ff_blocks)
104 .field("apply_ff_blocks", &self.apply_ff_blocks)
105 .field("comb_blocks", &self.comb_blocks)
106 .field("comb_observers", &self.comb_observers)
107 .finish()
108 }
109}