Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions crates/ast/src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,13 @@ impl FilamentParser {
.map_err(|_| input.error("Expected valid bitwidth"))
}

fn float(input: Node) -> ParseResult<f64> {
input
.as_str()
.parse::<f64>()
.map_err(|_| input.error("Expected valid float"))
}

// ================ Intervals =====================
fn time(input: Node) -> ParseResult<Loc<ast::Time>> {
let sp = Self::get_span(&input);
Expand Down Expand Up @@ -833,12 +840,13 @@ impl FilamentParser {
Ok(())
}

fn attributes<Bool, Num>(
fn attributes<Bool, Num, Float>(
input: Node,
) -> ParseResult<utils::Attributes<Bool, Num>>
) -> ParseResult<utils::Attributes<Bool, Num, Float>>
where
Bool: FromStr + Hash + Eq + Copy,
Num: FromStr + Hash + Eq + Copy,
Float: FromStr + Hash + Eq + Copy,
{
let mut attrs = utils::Attributes::default();
for attr in input.into_children() {
Expand All @@ -853,6 +861,9 @@ impl FilamentParser {
[identifier(name), bitwidth(val)] => Num::from_str(name.as_ref()).map(
|attr| attrs.set(attr, val, name.pos())).map_err(
|_| attr.error(format!("Found unknown numeric attribute \"{name}\""))),
[identifier(name), float(val)] => Float::from_str(name.as_ref()).map(
|attr| attrs.set(attr, val, name.pos())).map_err(
|_| attr.error(format!("Found unknown float attribute \"{name}\""))),
)?;
}

Expand Down
4 changes: 4 additions & 0 deletions crates/ast/src/syntax.pest
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ identifier = @{ ("_" | ASCII_ALPHA)+ ~ ("_" | ASCII_ALPHA | ASCII_DIGIT)* }
// Positive numbers
bitwidth = @{ ASCII_DIGIT+ }

// Float
float = @{ ASCII_DIGIT+ ~ "." ~ ASCII_DIGIT+ }

char = { !"\"" ~ ANY }
string_lit = ${ "\"" ~ char* ~ "\"" }
import = _{
Expand Down Expand Up @@ -74,6 +77,7 @@ not = { "not" }
attr_bind = {
not ~ "(" ~ identifier ~ ")"
| identifier ~ "=" ~ bitwidth
| identifier ~ "=" ~ float
| identifier
}

Expand Down
40 changes: 35 additions & 5 deletions crates/utils/src/attr/attributes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,26 @@ use crate::GPosIdx;
use std::{hash::Hash, str::FromStr};

/// Stores the attributes of a component
#[derive(Clone, PartialEq, Eq)]
pub struct Attributes<Bool, Num>
#[derive(Clone)]
pub struct Attributes<Bool, Num, Float>
where
Bool: FromStr + Hash + Eq + Copy,
Num: FromStr + Hash + Eq + Copy,
Float: FromStr + Hash + Eq + Copy,
{
/// Numerical attributes
num_attrs: AttrStore<Num, u64>,
/// Boolean attributes
bool_attrs: AttrStore<Bool, bool>,
/// Float attributes
float_attrs: AttrStore<Float, f64>,
}

impl<Bool, Num> AttrCtx<Num, u64> for Attributes<Bool, Num>
impl<Bool, Num, Float> AttrCtx<Num, u64> for Attributes<Bool, Num, Float>
where
Bool: FromStr + Hash + Eq + Copy,
Num: FromStr + Hash + Eq + Copy,
Float: FromStr + Hash + Eq + Copy,
{
fn get(&self, attr: Num) -> Option<&u64> {
self.num_attrs.get(attr)
Expand All @@ -37,10 +41,11 @@ where
}
}

impl<Bool, Num> AttrCtx<Bool, bool> for Attributes<Bool, Num>
impl<Bool, Num, Float> AttrCtx<Bool, bool> for Attributes<Bool, Num, Float>
where
Bool: FromStr + Hash + Eq + Copy,
Num: FromStr + Hash + Eq + Copy,
Float: FromStr + Hash + Eq + Copy,
{
fn get(&self, attr: Bool) -> Option<&bool> {
self.bool_attrs.get(attr)
Expand All @@ -59,15 +64,40 @@ where
}
}

impl<Bool, Num> Default for Attributes<Bool, Num>
impl<Bool, Num, Float> AttrCtx<Float, f64> for Attributes<Bool, Num, Float>
where
Bool: FromStr + Hash + Eq + Copy,
Num: FromStr + Hash + Eq + Copy,
Float: FromStr + Hash + Eq + Copy,
{
fn get(&self, attr: Float) -> Option<&f64> {
self.float_attrs.get(attr)
}

fn get_loc(&self, attr: Float) -> Option<GPosIdx> {
self.float_attrs.get_loc(attr)
}

fn set(&mut self, attr: Float, value: f64, loc: GPosIdx) {
self.float_attrs.set(attr, value, loc);
}

fn remove(&mut self, attr: Float) {
self.float_attrs.remove(attr);
}
}

impl<Bool, Num, Float> Default for Attributes<Bool, Num, Float>
where
Bool: FromStr + Hash + Eq + Copy,
Num: FromStr + Hash + Eq + Copy,
Float: FromStr + Hash + Eq + Copy,
{
fn default() -> Self {
Self {
num_attrs: AttrStore::default(),
bool_attrs: AttrStore::default(),
float_attrs: AttrStore::default(),
}
}
}
2 changes: 1 addition & 1 deletion crates/utils/src/attr/store.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use crate::{attr::AttrCtx, GPosIdx};
use std::collections::HashMap;

/// A store for attributes
#[derive(Clone, PartialEq, Eq)]
#[derive(Clone)]
pub struct AttrStore<Attr, Value>
where
Attr: Eq + std::hash::Hash + Copy,
Expand Down
5 changes: 3 additions & 2 deletions crates/utils/src/attr/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@ attr_set! {
CounterFSM: "counter_fsm",
};
};
numeric {
};
numeric {};
float {};
}

attr_set! {
port_attrs;
flag {};
numeric {};
float {};
}
60 changes: 35 additions & 25 deletions crates/utils/src/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -124,31 +124,41 @@ attr_set! {
}
*/
macro_rules! attr_set {
(
$module:ident;
flag {
$(
$flag_tokens:tt
)*
};
numeric {
$(
$num_tokens:tt
)*
};
) => {
pub mod $module {
$crate::attr_enum! {
enum Bool;
$($flag_tokens)*
}
(
$module:ident;
flag {
$(
$flag_tokens:tt
)*
};
numeric {
$(
$num_tokens:tt
)*
};
float {
$(
$float_tokens:tt
)*
};
) => {
pub mod $module {
$crate::attr_enum! {
enum Bool;
$($flag_tokens)*
}

$crate::attr_enum! {
enum Num;
$($num_tokens)*
}
$crate::attr_enum! {
enum Num;
$($num_tokens)*
}

pub type Attrs = $crate::Attributes<Bool, Num>;
}
};
$crate::attr_enum! {
enum Float;
$($float_tokens)*
}

pub type Attrs = $crate::Attributes<Bool, Num, Float>;
}
};
}
Loading