Skip to main content

celox_frontend_core/symbolic/
artifact.rs

1use 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/// Source-independent variable metadata consumed by symbolic assembly.
17#[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}