Skip to content

Commit 1965fc7

Browse files
authored
add float attributes (#489)
* add float attributes * add parser implementation
1 parent b13ba6f commit 1965fc7

File tree

6 files changed

+91
-35
lines changed

6 files changed

+91
-35
lines changed

crates/ast/src/parser.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,13 @@ impl FilamentParser {
239239
.map_err(|_| input.error("Expected valid bitwidth"))
240240
}
241241

242+
fn float(input: Node) -> ParseResult<f64> {
243+
input
244+
.as_str()
245+
.parse::<f64>()
246+
.map_err(|_| input.error("Expected valid float"))
247+
}
248+
242249
// ================ Intervals =====================
243250
fn time(input: Node) -> ParseResult<Loc<ast::Time>> {
244251
let sp = Self::get_span(&input);
@@ -833,12 +840,13 @@ impl FilamentParser {
833840
Ok(())
834841
}
835842

836-
fn attributes<Bool, Num>(
843+
fn attributes<Bool, Num, Float>(
837844
input: Node,
838-
) -> ParseResult<utils::Attributes<Bool, Num>>
845+
) -> ParseResult<utils::Attributes<Bool, Num, Float>>
839846
where
840847
Bool: FromStr + Hash + Eq + Copy,
841848
Num: FromStr + Hash + Eq + Copy,
849+
Float: FromStr + Hash + Eq + Copy,
842850
{
843851
let mut attrs = utils::Attributes::default();
844852
for attr in input.into_children() {
@@ -853,6 +861,9 @@ impl FilamentParser {
853861
[identifier(name), bitwidth(val)] => Num::from_str(name.as_ref()).map(
854862
|attr| attrs.set(attr, val, name.pos())).map_err(
855863
|_| attr.error(format!("Found unknown numeric attribute \"{name}\""))),
864+
[identifier(name), float(val)] => Float::from_str(name.as_ref()).map(
865+
|attr| attrs.set(attr, val, name.pos())).map_err(
866+
|_| attr.error(format!("Found unknown float attribute \"{name}\""))),
856867
)?;
857868
}
858869

crates/ast/src/syntax.pest

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ identifier = @{ ("_" | ASCII_ALPHA)+ ~ ("_" | ASCII_ALPHA | ASCII_DIGIT)* }
99
// Positive numbers
1010
bitwidth = @{ ASCII_DIGIT+ }
1111

12+
// Float
13+
float = @{ ASCII_DIGIT+ ~ "." ~ ASCII_DIGIT+ }
14+
1215
char = { !"\"" ~ ANY }
1316
string_lit = ${ "\"" ~ char* ~ "\"" }
1417
import = _{
@@ -74,6 +77,7 @@ not = { "not" }
7477
attr_bind = {
7578
not ~ "(" ~ identifier ~ ")"
7679
| identifier ~ "=" ~ bitwidth
80+
| identifier ~ "=" ~ float
7781
| identifier
7882
}
7983

crates/utils/src/attr/attributes.rs

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,26 @@ use crate::GPosIdx;
33
use std::{hash::Hash, str::FromStr};
44

55
/// Stores the attributes of a component
6-
#[derive(Clone, PartialEq, Eq)]
7-
pub struct Attributes<Bool, Num>
6+
#[derive(Clone)]
7+
pub struct Attributes<Bool, Num, Float>
88
where
99
Bool: FromStr + Hash + Eq + Copy,
1010
Num: FromStr + Hash + Eq + Copy,
11+
Float: FromStr + Hash + Eq + Copy,
1112
{
1213
/// Numerical attributes
1314
num_attrs: AttrStore<Num, u64>,
1415
/// Boolean attributes
1516
bool_attrs: AttrStore<Bool, bool>,
17+
/// Float attributes
18+
float_attrs: AttrStore<Float, f64>,
1619
}
1720

18-
impl<Bool, Num> AttrCtx<Num, u64> for Attributes<Bool, Num>
21+
impl<Bool, Num, Float> AttrCtx<Num, u64> for Attributes<Bool, Num, Float>
1922
where
2023
Bool: FromStr + Hash + Eq + Copy,
2124
Num: FromStr + Hash + Eq + Copy,
25+
Float: FromStr + Hash + Eq + Copy,
2226
{
2327
fn get(&self, attr: Num) -> Option<&u64> {
2428
self.num_attrs.get(attr)
@@ -37,10 +41,11 @@ where
3741
}
3842
}
3943

40-
impl<Bool, Num> AttrCtx<Bool, bool> for Attributes<Bool, Num>
44+
impl<Bool, Num, Float> AttrCtx<Bool, bool> for Attributes<Bool, Num, Float>
4145
where
4246
Bool: FromStr + Hash + Eq + Copy,
4347
Num: FromStr + Hash + Eq + Copy,
48+
Float: FromStr + Hash + Eq + Copy,
4449
{
4550
fn get(&self, attr: Bool) -> Option<&bool> {
4651
self.bool_attrs.get(attr)
@@ -59,15 +64,40 @@ where
5964
}
6065
}
6166

62-
impl<Bool, Num> Default for Attributes<Bool, Num>
67+
impl<Bool, Num, Float> AttrCtx<Float, f64> for Attributes<Bool, Num, Float>
6368
where
6469
Bool: FromStr + Hash + Eq + Copy,
6570
Num: FromStr + Hash + Eq + Copy,
71+
Float: FromStr + Hash + Eq + Copy,
72+
{
73+
fn get(&self, attr: Float) -> Option<&f64> {
74+
self.float_attrs.get(attr)
75+
}
76+
77+
fn get_loc(&self, attr: Float) -> Option<GPosIdx> {
78+
self.float_attrs.get_loc(attr)
79+
}
80+
81+
fn set(&mut self, attr: Float, value: f64, loc: GPosIdx) {
82+
self.float_attrs.set(attr, value, loc);
83+
}
84+
85+
fn remove(&mut self, attr: Float) {
86+
self.float_attrs.remove(attr);
87+
}
88+
}
89+
90+
impl<Bool, Num, Float> Default for Attributes<Bool, Num, Float>
91+
where
92+
Bool: FromStr + Hash + Eq + Copy,
93+
Num: FromStr + Hash + Eq + Copy,
94+
Float: FromStr + Hash + Eq + Copy,
6695
{
6796
fn default() -> Self {
6897
Self {
6998
num_attrs: AttrStore::default(),
7099
bool_attrs: AttrStore::default(),
100+
float_attrs: AttrStore::default(),
71101
}
72102
}
73103
}

crates/utils/src/attr/store.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::{attr::AttrCtx, GPosIdx};
22
use std::collections::HashMap;
33

44
/// A store for attributes
5-
#[derive(Clone, PartialEq, Eq)]
5+
#[derive(Clone)]
66
pub struct AttrStore<Attr, Value>
77
where
88
Attr: Eq + std::hash::Hash + Copy,

crates/utils/src/attr/types.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@ attr_set! {
1010
CounterFSM: "counter_fsm",
1111
};
1212
};
13-
numeric {
14-
};
13+
numeric {};
14+
float {};
1515
}
1616

1717
attr_set! {
1818
port_attrs;
1919
flag {};
2020
numeric {};
21+
float {};
2122
}

crates/utils/src/macros.rs

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -124,31 +124,41 @@ attr_set! {
124124
}
125125
*/
126126
macro_rules! attr_set {
127-
(
128-
$module:ident;
129-
flag {
130-
$(
131-
$flag_tokens:tt
132-
)*
133-
};
134-
numeric {
135-
$(
136-
$num_tokens:tt
137-
)*
138-
};
139-
) => {
140-
pub mod $module {
141-
$crate::attr_enum! {
142-
enum Bool;
143-
$($flag_tokens)*
144-
}
127+
(
128+
$module:ident;
129+
flag {
130+
$(
131+
$flag_tokens:tt
132+
)*
133+
};
134+
numeric {
135+
$(
136+
$num_tokens:tt
137+
)*
138+
};
139+
float {
140+
$(
141+
$float_tokens:tt
142+
)*
143+
};
144+
) => {
145+
pub mod $module {
146+
$crate::attr_enum! {
147+
enum Bool;
148+
$($flag_tokens)*
149+
}
145150

146-
$crate::attr_enum! {
147-
enum Num;
148-
$($num_tokens)*
149-
}
151+
$crate::attr_enum! {
152+
enum Num;
153+
$($num_tokens)*
154+
}
150155

151-
pub type Attrs = $crate::Attributes<Bool, Num>;
152-
}
153-
};
156+
$crate::attr_enum! {
157+
enum Float;
158+
$($float_tokens)*
159+
}
160+
161+
pub type Attrs = $crate::Attributes<Bool, Num, Float>;
162+
}
163+
};
154164
}

0 commit comments

Comments
 (0)