diff --git a/Cargo.lock b/Cargo.lock
index d80ef9b55e384abfea10856cc1d43db32c507aa7..3b322cd2e2bd46a5f0724b8dc91930a2c8bb3c2e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -28,6 +28,12 @@ dependencies = [
  "hashbrown",
 ]
 
+[[package]]
+name = "itoa"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736"
+
 [[package]]
 name = "petgraph"
 version = "0.5.1"
@@ -38,9 +44,93 @@ dependencies = [
  "indexmap",
 ]
 
+[[package]]
+name = "proc-macro2"
+version = "1.0.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038"
+dependencies = [
+ "unicode-xid",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
+dependencies = [
+ "proc-macro2",
+]
+
 [[package]]
 name = "rsim"
 version = "0.1.0"
 dependencies = [
  "petgraph",
+ "serde",
+ "serde_arrays",
+ "serde_json",
 ]
+
+[[package]]
+name = "ryu"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
+
+[[package]]
+name = "serde"
+version = "1.0.126"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_arrays"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38636132857f68ec3d5f3eb121166d2af33cb55174c4d5ff645db6165cbef0fd"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.126"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.73"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-xid",
+]
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
diff --git a/Cargo.toml b/Cargo.toml
index c5e4fb6219b28d7bdc685b6cba2249832c99955e..268cfadf811c7d5f7f742686ddf2991078d14057 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -8,3 +8,8 @@ edition = "2018"
 
 [dependencies]
 petgraph = "0.5.1"
+serde_arrays = "0.1.0"
+serde_json = "1.0.64"
+[dependencies.serde] 
+version = "1.0.126"
+features = ["derive"]
diff --git a/src/bitarr.rs b/src/bitarr.rs
index 4a1b96243c38818ab3d9a6bdc2e39ecfc1bd803f..963c5283304d1354f8b7551038cb47169c40c13d 100644
--- a/src/bitarr.rs
+++ b/src/bitarr.rs
@@ -1,3 +1,4 @@
+use serde::{Deserialize, Serialize};
 use std::cell::Cell;
 use std::convert::TryFrom;
 use std::convert::{From, Into};
@@ -111,8 +112,8 @@ impl<const N: usize> BitOr for &BitArr<N> {
     }
 }
 
-#[test]
 mod test {
+    use crate::bitarr::*;
     #[test]
     fn extensions() {
         let a: BitArr<2> = 0b10u8.into();
diff --git a/src/main.rs b/src/main.rs
index 7f4e78c28e3fe1618fe7c20c900cec78565205ec..839f8585b1067ffde782d5729b1e7aba462984e7 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -68,6 +68,26 @@ use rsim::*;
 //use std::cell::Cell;
 
 // two input mux
+use serde::{Deserialize, Serialize};
+use serde_json;
+#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
+struct MyArr<const N: usize> {
+    #[serde(with = "serde_arrays")]
+    arr: [bool; N],
+}
+
+#[test]
+fn test_serde() {
+    println!("test serde");
+    let arr = MyArr { arr: [false; 8] };
+    let json = serde_json::to_string(&arr).unwrap();
+    println!("json {:?}", json);
+    let arr2 = serde_json::from_str(&json).unwrap();
+    assert_eq!(arr, arr2);
+    println!("arr2 {:?}", arr2);
+}
+
+#[derive(Debug, Clone, PartialEq)]
 struct Mux<'a, const N: usize> {
     ins: (Signal<'a, N>, Signal<'a, N>),
     sel: Signal<'a, 1>,
@@ -91,15 +111,10 @@ struct ZeroExt<'a, const N: usize, const M: usize> {
 
 impl<'a, const N: usize, const M: usize> Eval for ZeroExt<'a, N, M> {
     fn eval(&self) -> () {
-        let mut res = BitArr([false; M]);
-        res[0..N].clone_from_slice(&*self.ins.r());
-
-        self.out.w(res);
+        self.out.w(self.ins.r().zero_ext());
     }
 }
 
-
-
 #[test]
 fn test_zero_ext() {
     let mut ins: BitArr<2> = 0b10u8.into();
diff --git a/src/signal.rs b/src/signal.rs
index cbac7f5c00f8d22b76f479cafd4e4b20785751b4..430cacdf1b33a4c93acbc82392e9e0cdc31d56da 100644
--- a/src/signal.rs
+++ b/src/signal.rs
@@ -1,3 +1,4 @@
+use serde::{Deserialize, Serialize};
 use std::cell::Cell;
 use std::convert::TryFrom;
 use std::convert::{From, Into};