use crate::netlist::InstanceId;
use crate::sched::assert_control::SiteDesc;
use crate::state::EdgeKind;
use crate::sva::engine::AssertKind;
use crate::sva::ir::{LeafId, LocalVarId};
use crate::sva::property::PropertyIr;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct CasePairImage {
pub selector: LeafId,
pub label: LeafId,
pub symbol: u32,
}
#[derive(Clone, Debug, PartialEq)]
pub struct AssertionImage {
pub plan_index: u32,
pub instance: InstanceId,
pub kernel: u32,
pub frame_words: u32,
pub label: String,
pub kind: AssertKind,
pub ir: PropertyIr,
pub n_clocks: u32,
pub hist_clocks: u32,
pub leaf_reads: Vec<Vec<LocalVarId>>,
pub leaf_writes: Vec<Option<LocalVarId>>,
pub activated: bool,
pub captured: Vec<LocalVarId>,
pub disable_mixed: bool,
pub tick_history: bool,
pub history_depth: u32,
pub future: bool,
pub future_clock: u32,
pub src_offset: Option<u64>,
pub leaf_src: Vec<(u32, u64, u64)>,
pub row_len: u32,
pub snap: u32,
pub ticks: Vec<u32>,
pub leaves: Vec<Option<u32>>,
pub live_leaves: Vec<Option<u32>>,
pub cases: Vec<CasePairImage>,
pub site: Option<SiteDesc>,
pub end_cell: Option<u32>,
pub current_words: Vec<(String, u32, u32)>,
pub observed_words: Vec<(u32, u32)>,
pub coll_words: Vec<u32>,
pub coll_nests: Vec<crate::collections::Nest>,
pub spawn_calls: Vec<SpawnCallImage>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SpawnCallImage {
pub call: u32,
pub kernel: u32,
pub frame_words: u32,
pub entry_pc: u32,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct FreeVarImage {
pub id: String,
pub slot: u32,
pub width: u32,
pub wide: bool,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct FreeGroupImage {
pub instance: InstanceId,
pub vars: Vec<FreeVarImage>,
pub rng: u64,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SampledSiteImage {
pub guard: u32,
pub shifts: Vec<(u32, u32)>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SampledImage {
pub instance: InstanceId,
pub sites: Vec<SampledSiteImage>,
pub p_copies: Vec<(u32, u32)>,
}
pub const SKEW_STEP: u64 = u64::MAX;
pub const SKEW_EDGE_OPP: u64 = u64::MAX - 1;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ClockingImage {
pub instance: InstanceId,
pub terms: Vec<(u32, Option<EdgeKind>)>,
pub gates: Vec<(u32, u32)>,
pub samples: Vec<(u32, u32, u32)>,
pub skews: Vec<u64>,
pub parts: Vec<Vec<(u32, u32, u32, u32)>>,
pub counter: u32,
pub term_owners: Vec<InstanceId>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct CovSamplerImage {
pub terms: Vec<(u32, Option<EdgeKind>)>,
pub gates: Vec<(u32, u32)>,
pub exprs: Vec<CovExprTermImage>,
pub strobe: bool,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct CovExprTermImage {
pub func: u32,
pub edge: Option<EdgeKind>,
pub wake: Vec<u32>,
pub gates: Vec<u32>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct CovClassClockImage {
pub terms: Vec<(u32, Option<EdgeKind>)>,
pub gates: Vec<(u32, u32)>,
pub strobe: bool,
}
#[derive(Clone, Debug, PartialEq)]
pub struct CovGroupImage {
pub type_index: u32,
pub site: u32,
pub instance: InstanceId,
pub decl: crate::covergroup::decl::CovGroupDecl,
pub kernels: Vec<u32>,
pub sampler: Option<CovSamplerImage>,
pub class_clock: Option<CovClassClockImage>,
pub blocks: Vec<u64>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct VerifImage {
pub assertions: Vec<AssertionImage>,
pub free_groups: Vec<FreeGroupImage>,
pub sampled: Vec<SampledImage>,
pub clocking: Vec<ClockingImage>,
pub covergroups: Vec<CovGroupImage>,
}
impl VerifImage {
pub fn is_empty(&self) -> bool {
let VerifImage {
assertions,
free_groups,
sampled,
clocking,
covergroups,
} = self;
assertions.is_empty()
&& free_groups.is_empty()
&& sampled.is_empty()
&& clocking.is_empty()
&& covergroups.is_empty()
}
}