diff --git a/Cargo.lock b/Cargo.lock index 63d3944ac..3a2b21ade 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,24 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + [[package]] name = "eda4eda" version = "0.1.0" +dependencies = [ + "slab", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] diff --git a/Cargo.toml b/Cargo.toml index 4c11a14fc..ec6a31246 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,3 +6,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +slab = "0.4.8" diff --git a/src/builder/arith.rs b/src/builder/arith.rs new file mode 100644 index 000000000..47bae5002 --- /dev/null +++ b/src/builder/arith.rs @@ -0,0 +1,12 @@ +use super::ctx::Reference; + +enum Opcode { + Add, + Mul, +} + +pub struct Expr { + opcode: Opcode, + operands: Vec +} + diff --git a/src/builder/context.rs b/src/builder/context.rs new file mode 100644 index 000000000..3d36b2b68 --- /dev/null +++ b/src/builder/context.rs @@ -0,0 +1,75 @@ +use slab; + +use crate::{Data, Module}; + +use super::data::Expr; + +pub enum Element { + Module(Module), + Data(Data), + Expr(Expr), +} + +impl Element { + + fn set_key(&mut self, key: usize) { + match self { + Element::Module(module) => { module.key = key; } + _ => panic!("Element::set_key: unexpected element type"), + } + } + +} + +pub struct Context { + slab: slab::Slab, +} + +pub trait IsElement { + fn into_reference(key: usize) -> Reference; +} + +macro_rules! register_element { + ($name:ident) => { + + impl Into for $name { + fn into(self) -> Element { + Element::$name(self) + } + } + + impl IsElement for $name { + fn into_reference(key: usize) -> Reference { + Reference::Module(key) + } + } + + }; +} + +register_element!(Module); +register_element!(Data); + + +pub enum Reference { + Module(usize), + Data(usize), + Expr(usize), +} + +impl Context { + + pub fn new() -> Self { + Context { + slab: slab::Slab::new(), + } + } + + pub fn insert + IsElement>(&mut self, elem: T) -> Reference { + let key = self.slab.insert(elem.into()); + self.slab.get_mut(key).unwrap().set_key(key); + T::into_reference(key) + } + +} + diff --git a/src/builder/data.rs b/src/builder/data.rs index e4acb6cee..b724496fd 100644 --- a/src/builder/data.rs +++ b/src/builder/data.rs @@ -1,4 +1,23 @@ +use crate::Context; + +use super::ctx::Reference; + pub struct Data { + parent: Option, + name: String, bits: usize, } +impl Data { + + pub fn new(ctx: &mut Context, name: &str, bits: usize) -> Reference { + let res = Data { + parent: None, + name: name.to_string(), + bits, + }; + ctx.insert(res) + } + +} + diff --git a/src/builder/mod.rs b/src/builder/mod.rs index 31f314761..1ba383f1a 100644 --- a/src/builder/mod.rs +++ b/src/builder/mod.rs @@ -1,2 +1,5 @@ -mod data; -mod module; +pub mod data; +pub mod module; +pub mod context; +pub mod arith; + diff --git a/src/builder/module.rs b/src/builder/module.rs index 3c25b61b1..0563bcf6a 100644 --- a/src/builder/module.rs +++ b/src/builder/module.rs @@ -1,8 +1,26 @@ -use super::data::Data; +use super::{ctx::{Context, Reference}, data::Data}; -struct Module { +pub struct Module { + pub(crate) key: usize, + name: String, subscriber: Vec, inputs: Vec, outputs: Vec, } +impl Module { + + pub fn new(ctx: &mut Context, name: &str, inputs: Vec) -> Reference { + let mut res = Module { + key: 0, + name: name.to_string(), + subscriber: Vec::new(), + inputs, + outputs: Vec::new(), + }; + ctx.insert(res) + } + + +} + diff --git a/src/lib.rs b/src/lib.rs index a67eea88e..b8485fb28 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,2 +1,6 @@ pub mod builder; +pub use builder::module::Module; +pub use builder::data::Data; +pub use builder::ctx::Context; +