From f8e2c6c86d3fb623465b840f91f6ee35d0e17d0c Mon Sep 17 00:00:00 2001 From: Jian Weng Date: Fri, 9 Feb 2024 13:09:04 +0300 Subject: [PATCH 1/2] wip --- Cargo.lock | 18 ++++++++++++++++++ Cargo.toml | 1 + src/builder/ctx.rs | 14 ++++++++++++++ src/builder/data.rs | 41 +++++++++++++++++++++++++++++++++++++++++ src/builder/mod.rs | 5 +++-- src/builder/module.rs | 24 ++++++++++++++++++++++-- src/lib.rs | 3 +++ 7 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 src/builder/ctx.rs 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/ctx.rs b/src/builder/ctx.rs new file mode 100644 index 000000000..7e481e9be --- /dev/null +++ b/src/builder/ctx.rs @@ -0,0 +1,14 @@ +use slab; + +use crate::{Data, Module}; + +use super::data::Expr; + +pub enum Element { + Module(Module), + Data(Data), + Expr(Expr), +} + +pub static mut CONTEXT_SLAB: slab::Slab = slab::Slab::new(); + diff --git a/src/builder/data.rs b/src/builder/data.rs index e4acb6cee..c4bc4a28c 100644 --- a/src/builder/data.rs +++ b/src/builder/data.rs @@ -1,4 +1,45 @@ pub struct Data { + name: String, bits: usize, } +enum Opcode { + Add, + Mul, +} + +enum Operand { + Data(Data), + Expr(Expr), +} + +pub struct Expr { + opcode: Opcode, + operands: Vec> +} + +trait Arithmetic { + fn add(&self, other: &Data) -> Expr; + fn mul(&self, other: &Data) -> Expr; +} + +impl Data { + pub fn new(name: &str, bits: usize) -> Self { + Data { + name: name.to_string(), + bits, + } + } + + // pub fn add(&self, other: &Data) -> Expr { + // Expr { + // opcode: Opcode::Add, + // operands: vec![ + // Box::new(), + // Box::new(), + // ] + // } + // } + +} + diff --git a/src/builder/mod.rs b/src/builder/mod.rs index 31f314761..42f7aa834 100644 --- a/src/builder/mod.rs +++ b/src/builder/mod.rs @@ -1,2 +1,3 @@ -mod data; -mod module; +pub mod data; +pub mod module; +mod ctx; diff --git a/src/builder/module.rs b/src/builder/module.rs index 3c25b61b1..a88b5d73f 100644 --- a/src/builder/module.rs +++ b/src/builder/module.rs @@ -1,8 +1,28 @@ -use super::data::Data; +use super::{ctx::{Element, CONTEXT_SLAB}, data::Data}; -struct Module { +pub struct Module { + name: String, subscriber: Vec, inputs: Vec, outputs: Vec, } +impl Module { + + pub fn new(name: &str, inputs: Vec) -> &Self { + let res = Module { + name: name.to_string(), + subscriber: Vec::new(), + inputs, + outputs: Vec::new(), + }; + let key = unsafe { CONTEXT_SLAB.insert(Element::Module(res)) }; + match unsafe { CONTEXT_SLAB.get(key).unwrap() } { + Element::Module(module) => module, + _ => panic!("Module::new: unexpected element type"), + } + } + + +} + diff --git a/src/lib.rs b/src/lib.rs index a67eea88e..1ead322c0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,2 +1,5 @@ pub mod builder; +pub use builder::module::Module; +pub use builder::data::Data; + From 5578a409ed10ed4c9fbfb76ae4c74e36d4c733f9 Mon Sep 17 00:00:00 2001 From: Jian Weng Date: Fri, 9 Feb 2024 14:23:21 +0300 Subject: [PATCH 2/2] wip --- src/builder/arith.rs | 12 +++++++ src/builder/context.rs | 75 ++++++++++++++++++++++++++++++++++++++++++ src/builder/ctx.rs | 14 -------- src/builder/data.rs | 44 +++++++------------------ src/builder/mod.rs | 4 ++- src/builder/module.rs | 14 ++++---- src/lib.rs | 1 + 7 files changed, 108 insertions(+), 56 deletions(-) create mode 100644 src/builder/arith.rs create mode 100644 src/builder/context.rs delete mode 100644 src/builder/ctx.rs 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/ctx.rs b/src/builder/ctx.rs deleted file mode 100644 index 7e481e9be..000000000 --- a/src/builder/ctx.rs +++ /dev/null @@ -1,14 +0,0 @@ -use slab; - -use crate::{Data, Module}; - -use super::data::Expr; - -pub enum Element { - Module(Module), - Data(Data), - Expr(Expr), -} - -pub static mut CONTEXT_SLAB: slab::Slab = slab::Slab::new(); - diff --git a/src/builder/data.rs b/src/builder/data.rs index c4bc4a28c..b724496fd 100644 --- a/src/builder/data.rs +++ b/src/builder/data.rs @@ -1,45 +1,23 @@ +use crate::Context; + +use super::ctx::Reference; + pub struct Data { + parent: Option, name: String, bits: usize, } -enum Opcode { - Add, - Mul, -} - -enum Operand { - Data(Data), - Expr(Expr), -} - -pub struct Expr { - opcode: Opcode, - operands: Vec> -} - -trait Arithmetic { - fn add(&self, other: &Data) -> Expr; - fn mul(&self, other: &Data) -> Expr; -} - impl Data { - pub fn new(name: &str, bits: usize) -> Self { - 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) } - // pub fn add(&self, other: &Data) -> Expr { - // Expr { - // opcode: Opcode::Add, - // operands: vec![ - // Box::new(), - // Box::new(), - // ] - // } - // } - } diff --git a/src/builder/mod.rs b/src/builder/mod.rs index 42f7aa834..1ba383f1a 100644 --- a/src/builder/mod.rs +++ b/src/builder/mod.rs @@ -1,3 +1,5 @@ pub mod data; pub mod module; -mod ctx; +pub mod context; +pub mod arith; + diff --git a/src/builder/module.rs b/src/builder/module.rs index a88b5d73f..0563bcf6a 100644 --- a/src/builder/module.rs +++ b/src/builder/module.rs @@ -1,6 +1,7 @@ -use super::{ctx::{Element, CONTEXT_SLAB}, data::Data}; +use super::{ctx::{Context, Reference}, data::Data}; pub struct Module { + pub(crate) key: usize, name: String, subscriber: Vec, inputs: Vec, @@ -9,18 +10,15 @@ pub struct Module { impl Module { - pub fn new(name: &str, inputs: Vec) -> &Self { - let res = 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(), }; - let key = unsafe { CONTEXT_SLAB.insert(Element::Module(res)) }; - match unsafe { CONTEXT_SLAB.get(key).unwrap() } { - Element::Module(module) => module, - _ => panic!("Module::new: unexpected element type"), - } + ctx.insert(res) } diff --git a/src/lib.rs b/src/lib.rs index 1ead322c0..b8485fb28 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,4 +2,5 @@ pub mod builder; pub use builder::module::Module; pub use builder::data::Data; +pub use builder::ctx::Context;