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 {