diff --git a/Cargo.lock b/Cargo.lock index 552dd862340e9e5a370fa68b0fe21c524e2357d7..d80ef9b55e384abfea10856cc1d43db32c507aa7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,5 +1,46 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "fixedbitset" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" + +[[package]] +name = "hashbrown" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" + +[[package]] +name = "indexmap" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "petgraph" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7" +dependencies = [ + "fixedbitset", + "indexmap", +] + [[package]] name = "rsim" version = "0.1.0" +dependencies = [ + "petgraph", +] diff --git a/Cargo.toml b/Cargo.toml index cc22a4ec0dcbfd569ac12a6051592037fa04ecd2..c5e4fb6219b28d7bdc685b6cba2249832c99955e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,3 +7,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +petgraph = "0.5.1" diff --git a/src/lib.rs b/src/lib.rs index 5906b1994203cce61b51bbf4341f0e60e606bada..f2f7888e17e2b09611670228ab3c4b7dc437dd24 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,2 +1,11 @@ mod signal; pub use signal::*; + +pub struct Component { + pub inputs: Vec<Signal>, + pub outputs: Vec<(Signal, Box<Component>)>, +} + +pub trait Eval { + fn eval(&mut self) -> (); +} diff --git a/src/main.rs b/src/main.rs index 2d7e97c2a2b85a3a070798521bb12d5506acf57c..070b5e2070edc8cb03759b1cccad405b66d3a0a9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,39 +1,137 @@ use rsim::*; -fn main() { - let b: Signal = 12345u32.into(); - let c: Signal = 1245u32.into(); +// fn main() { +// let b: Signal = 12345u32.into(); +// let c: Signal = 1245u32.into(); - let s: Signal = Signal::new_zeroed(5); +// let s: Signal = Signal::new_zeroed(5); - let b8: Signal = 0b0000_1010u8.into(); +// let b8: Signal = 0b0000_1010u8.into(); - for i in 0..8 { - println!("b8[{}] {}", i, b8[i]); - } +// for i in 0..8 { +// println!("b8[{}] {}", i, b8[i]); +// } - println!("b8 {:b}", b8); +// println!("b8 {:b}", b8); - println!("s {:b}", s); +// println!("s {:b}", s); - println!("{:?}", s); +// println!("{:?}", s); - if b == c { - println!("eq"); - } +// if b == c { +// println!("eq"); +// } - println!("b {:?}", b); +// println!("b {:?}", b); - let i: u32 = b.into(); - println!("i {:?}", i); +// let i: u32 = b.into(); +// println!("i {:?}", i); - let a: Signal = 0b1001_0101u8.into(); - let b: Signal = 0b1111_0000u8.into(); - let c: Signal = &a & &b; +// let a: Signal = 0b1001_0101u8.into(); +// let b: Signal = 0b1111_0000u8.into(); +// let c: Signal = &a & &b; - println!("{:?}", a); - println!("{:?}", b); - println!("{:?}", c); +// println!("{:?}", a); +// println!("{:?}", b); +// println!("{:?}", c); - let r: u8 = (&a & &b).into(); +// let r: u8 = (&a & &b).into(); +// } + +// use petgraph::{ +// graph::{DiGraph, Node}, +// Directed, +// }; + +// use petgraph::dot::{Config, Dot}; +// use std::fs::File; +// use std::io::prelude::*; + +// fn main() { +// let mut deps = DiGraph::<&str, &str>::new(); +// let pg = deps.add_node("petgraph"); +// let fb = deps.add_node("fixedbitset"); +// let qc = deps.add_node("quickcheck"); +// let rand = deps.add_node("rand"); +// let libc = deps.add_node("libc"); +// deps.extend_with_edges(&[(pg, fb), (pg, qc), (qc, rand), (rand, libc), (qc, libc)]); +// println!("{:?}", Dot::with_config(&deps, &[Config::EdgeNoLabel])); + +// let out: String = Dot::with_config(&deps, &[Config::EdgeNoLabel]).to_string(); + +// let mut file = File::create("foo.dot").unwrap(); +// file.write_all(out.as_bytes()).unwrap(); +// } + +use std::cell::Cell; + +#[derive(Debug)] +struct CSignal(Cell<Signal>); + +#[derive(Debug)] +struct MuxIn<'a> { + a: &'a CSignal, + b: &'a CSignal, + sel: &'a CSignal, } + +fn main() {} + +// #[derive(Debug)] +// struct Mux<'a> { +// inputs: MuxIn<'a>, +// output: CSignal, +// } + +// impl<'a> Eval for Mux<'a> { +// fn eval(&mut self) { +// self.output = match self.inputs.sel[0] { +// false => self.inputs.a.get(), +// true => self.inputs.b, +// } +// .clone() +// } +// } + +// #[derive(Debug)] +// struct AndIn<'a> { +// a: &'a Signal, +// b: &'a Signal, +// } + +// #[derive(Debug)] +// struct And<'a> { +// inputs: AndIn<'a>, +// output: Signal, +// } + +// impl<'a> Eval for And<'a> { +// fn eval(&mut self) { +// self.output = (self.inputs.a & self.inputs.b).clone() +// } +// } + +// fn main() { +// let a: Signal = 1u8.into(); +// let b: Signal = 2u8.into(); + +// let mut and = And { +// inputs: AndIn { a: &a, b: &b }, +// output: Signal::new(), +// }; + +// let mut m = Mux { +// inputs: MuxIn { +// a: &a, +// b: &b, +// sel: &and.output, +// }, +// output: Signal::new(), +// }; + +// and.eval(); +// //println!("m {:?}", m); + +// m.eval(); +// // println!("m {:?}", m); +// } diff --git a/src/signal.rs b/src/signal.rs index 458c55a2ab7b799d9b808618a695a5f8f875b1bc..1011433e4c5be08021087496e0fea01e131cbf0d 100644 --- a/src/signal.rs +++ b/src/signal.rs @@ -3,7 +3,7 @@ use std::fmt; use std::ops::{BitAnd, Index}; use std::string::String; -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq, Copy, Clone)] pub struct Signal(Vec<bool>); impl Signal {