use std::collections::BTreeSet;
#[derive(
Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, serde::Serialize, serde::Deserialize,
)]
pub enum RamBase {
Param(u32),
Frame(i64),
Global(u64),
Private,
}
#[derive(
Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, serde::Serialize, serde::Deserialize,
)]
pub struct RamField {
pub base: RamBase,
pub offset: i64,
pub size: usize,
}
#[derive(
Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, serde::Serialize, serde::Deserialize,
)]
pub struct RamRegion {
pub base: RamBase,
pub lo: i64,
pub hi: i64,
}
#[derive(
Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, serde::Serialize, serde::Deserialize,
)]
pub struct RamObject {
pub base: RamBase,
}
#[derive(
Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, serde::Serialize, serde::Deserialize,
)]
pub struct RamLocations {
#[serde(default)]
pub fields: BTreeSet<RamField>,
#[serde(default)]
pub regions: BTreeSet<RamRegion>,
#[serde(default)]
pub objects: BTreeSet<RamObject>,
}
impl RamLocations {
pub fn len(&self) -> usize {
self.fields.len() + self.regions.len() + self.objects.len()
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn bases_invisible(&self) -> bool {
self.fields
.iter()
.all(|f| matches!(f.base, RamBase::Frame(_) | RamBase::Private))
&& self
.regions
.iter()
.all(|r| matches!(r.base, RamBase::Frame(_) | RamBase::Private))
&& self
.objects
.iter()
.all(|o| matches!(o.base, RamBase::Frame(_) | RamBase::Private))
}
}
#[derive(
Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, serde::Serialize, serde::Deserialize,
)]
pub struct Footprint {
#[serde(default)]
pub reads: RamLocations,
#[serde(default)]
pub writes: RamLocations,
}
impl Footprint {
pub fn len(&self) -> usize {
self.reads.len() + self.writes.len()
}
pub fn is_empty(&self) -> bool {
self.reads.is_empty() && self.writes.is_empty()
}
pub fn invisible(&self) -> bool {
self.reads
.fields
.iter()
.all(|f| matches!(f.base, RamBase::Private))
&& self
.reads
.regions
.iter()
.all(|r| matches!(r.base, RamBase::Private))
&& self
.reads
.objects
.iter()
.all(|o| matches!(o.base, RamBase::Private))
&& self.writes.bases_invisible()
}
}