diff --git a/src/main.rs b/src/main.rs index 46342cf3983a66e22d5cbe8aedd316d59a175a7f..c01853eccc0423c96a6687929ee23f919e53e066 100644 --- a/src/main.rs +++ b/src/main.rs @@ -67,68 +67,50 @@ use rsim::*; use std::cell::Cell; -#[derive(Debug, Clone)] -struct S<'a, const N: usize> { - i: &'a [Cell<bool>], -} - -impl<'a, const N: usize> S<'a, N> { - fn new(a: &'a mut [bool; N]) -> Self { - let cell_slice: &'a Cell<[bool]> = Cell::from_mut(a); - Self { - i: cell_slice.as_slice_of_cells(), - } - } -} - +// two input mux struct Mux<'a, const N: usize> { - ins: (S<'a, N>, S<'a, N>), - sel: &'a S<'a, 1>, - out: &'a S<'a, N>, + ins: (Signal<'a, N>, Signal<'a, N>), + sel: &'a Signal<'a, 1>, + out: &'a Signal<'a, N>, } impl<'a, const N: usize> Eval for Mux<'a, N> { fn eval(&self) -> () { - match self.sel.i[0].get() { - false => self.out.i[0].set(self.ins.0.i[0].get()), - true => self.out.i[0].set(self.ins.1.i[0].get()), + let sel = self.sel[0].get(); + for (i, o) in self.out.iter().enumerate() { + o.set(match sel { + false => self.ins.0[i].get(), + true => self.ins.1[i].get(), + }) } } } fn main() { - let slice = &mut [false, false]; - let cell_slice: &Cell<[bool]> = Cell::from_mut(slice); - let slice_cell: &[Cell<bool>] = cell_slice.as_slice_of_cells(); - println!("{}", slice_cell[0].get()); - slice_cell[0].set(true); - println!("{}", slice_cell[0].get()); - - let mut sd = [true]; - let s = S::new(&mut sd); - println!("{}", s.i[0].get()); - s.i[0].set(false); - println!("{}", s.i[0].get()); - - let mut in1 = [false]; - let mut in2 = [true]; + let mut in1 = [false, true]; + let mut in2 = [true, false]; let mut sel = [false]; - let sel = S::new(&mut sel); - let mut out = [false]; + let sel = Signal::new(&mut sel); + let mut out = [false, false]; - let out = &S::new(&mut out); + let out = &Signal::new(&mut out); let m = Mux { - ins: (S::new(&mut in1), S::new(&mut in2)), + ins: (Signal::new(&mut in1), Signal::new(&mut in2)), sel: &sel, out, }; - println!("m {:?}", m.out); + println!("m.out {:b}", m.out); + m.eval(); + sel[0].set(true); m.eval(); - sel.i[0].set(true); + println!("m.out {:b}", m.out); + // sel[0].set(false); + sel.store([false]); + sel.store_slice(&[false]); m.eval(); - println!("m {:?}", m.out); + println!("m.out {:b}", m.out); } // #[derive(Debug)] // struct Mux<'a, const I: usize, const S: usize, const N: usize> { diff --git a/src/signal.rs b/src/signal.rs index 79ab2f1cecb1afa4c6de5547874607a21414b2e5..efa270940be50d34ccdf3d85b1685bfc94c673eb 100644 --- a/src/signal.rs +++ b/src/signal.rs @@ -5,49 +5,79 @@ use std::ops::{BitAnd, BitOr, Deref, Index}; use std::string::String; #[derive(Debug, PartialEq, Clone)] -pub struct Signal<const N: usize> { + +pub struct Signal<'a, const N: usize> { // we should probably have set/get instead of exposing store - pub store: Cell<[bool; N]>, + pub store: &'a [Cell<bool>], } -impl<const N: usize> Signal<N> { - pub fn new() -> Self { +impl<'a, const N: usize> Signal<'a, N> { + pub fn new(arr: &'a mut [bool; N]) -> Self { + let cell_slice: &'a Cell<[bool]> = Cell::from_mut(arr); Self { - store: Cell::new([false; N]), + store: cell_slice.as_slice_of_cells(), } } - // pub fn set(&mut self, i: usize, b: bool) { - // self.store[i] = b; - // } + pub fn load(&self) -> [bool; N] { + let mut a = [false; N]; + for (i, v) in self.store.iter().enumerate() { + a[i] = v.get() + } + a + } + + pub fn store(&self, a: [bool; N]) { + for (i, v) in self.store.iter().enumerate() { + v.set(a[i]) + } + } + + pub fn store_slice(&self, a: &[bool]) { + for (i, v) in self.store.iter().enumerate() { + v.set(a[i]) + } + } } -// impl<const N: usize> fmt::Binary for Signal<N> { -// fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { -// let mut s = String::new(); -// for i in self.store.get().iter().rev() { -// s.push(if *i { '1' } else { '0' }); +// impl<'a, const N: usize> From<u8> for Signal<'a, N> { +// fn from(u: u8) -> Self { +// let mut bs = [false; N]; +// for i in 0..8 { +// bs[i] = 1 << i != 0 // } -// write!(f, "{}", s) +// Signal::new(&mut bs) // } // } -// impl<const N: usize> Deref for Signal<N> { -// type Target = [Cell<bool>; N]; +impl<'a, const N: usize> Deref for Signal<'a, N> { + type Target = [Cell<bool>]; -// fn deref(&self) -> Self::Target { -// (&self.store).as_slice_of_cells() -// } -// } + fn deref(&self) -> &Self::Target { + self.store + } +} -// impl<const N: usize> Index<usize> for Signal<N> { -// type Output = bool; +impl<'a, const N: usize> fmt::Binary for &Signal<'a, N> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut s = String::new(); + for i in self.store.iter().rev() { + s.push(if i.get() { '1' } else { '0' }); + } + write!(f, "{}", s) + } +} -// #[inline] -// fn index(self, index: usize) -> Self::Output { -// self.store.get()[index] -// } -// } +impl<'a, const N: usize> Index<usize> for Signal<'a, N> { + type Output = Signal<'a, 1>; + + #[inline] + fn index(&self, index: usize) -> Self::Output { + Signal { + store: &[self.store[index].clone()], + } + } +} // operations on signal // impl<const N: usize> BitAnd for &Signal<N> { @@ -80,18 +110,6 @@ impl<const N: usize> Signal<N> { // } // } -// impl<const N: usize> From<u8> for Signal<N> { -// fn from(u: u8) -> Self { -// let mut bs = [false; N]; -// for i in 0..8 { -// bs[i] = u & (1 << i) != 0 -// } -// Signal { -// store: Cell::new(bs), -// } -// } -// } - // impl<const N: usize> From<[bool; N]> for Signal<N> { // fn from(a: [bool; N]) -> Self { // Signal {