forked from libre-chip/fayalite
sim: add SimValue and reading/writing more than just a scalar
This commit is contained in:
parent
304d8da0e8
commit
21c73051ec
5 changed files with 1719 additions and 460 deletions
|
|
@ -5,7 +5,8 @@ use fayalite::{
|
|||
int::UIntValue,
|
||||
prelude::*,
|
||||
reset::ResetType,
|
||||
sim::{time::SimDuration, vcd::VcdWriterDecls, Simulation},
|
||||
sim::{time::SimDuration, vcd::VcdWriterDecls, Simulation, ToSimValue},
|
||||
ty::StaticType,
|
||||
util::RcWriter,
|
||||
};
|
||||
use std::num::NonZeroUsize;
|
||||
|
|
@ -309,6 +310,8 @@ pub fn enums() {
|
|||
let which_out: UInt<2> = m.output();
|
||||
#[hdl]
|
||||
let data_out: UInt<4> = m.output();
|
||||
#[hdl]
|
||||
let b_out: HdlOption<(UInt<1>, Bool)> = m.output();
|
||||
|
||||
#[hdl]
|
||||
struct MyStruct<T> {
|
||||
|
|
@ -348,6 +351,8 @@ pub fn enums() {
|
|||
}
|
||||
}
|
||||
|
||||
connect(b_out, HdlNone());
|
||||
|
||||
#[hdl]
|
||||
match the_reg {
|
||||
MyEnum::A => {
|
||||
|
|
@ -357,6 +362,7 @@ pub fn enums() {
|
|||
MyEnum::B(v) => {
|
||||
connect(which_out, 1_hdl_u2);
|
||||
connect_any(data_out, v.0 | (v.1.cast_to_static::<UInt<1>>() << 1));
|
||||
connect(b_out, HdlSome(v));
|
||||
}
|
||||
MyEnum::C(v) => {
|
||||
connect(which_out, 2_hdl_u2);
|
||||
|
|
@ -382,13 +388,33 @@ fn test_enums() {
|
|||
sim.advance_time(SimDuration::from_nanos(100));
|
||||
sim.write_reset(sim.io().cd.rst, false);
|
||||
sim.advance_time(SimDuration::from_nanos(900));
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
type BOutTy = HdlOption<(UInt<1>, Bool)>;
|
||||
#[derive(Debug)]
|
||||
struct IO {
|
||||
en: bool,
|
||||
which_in: u8,
|
||||
data_in: u8,
|
||||
which_out: u8,
|
||||
data_out: u8,
|
||||
b_out: Expr<BOutTy>,
|
||||
}
|
||||
impl PartialEq for IO {
|
||||
fn eq(&self, other: &Self) -> bool {
|
||||
let Self {
|
||||
en,
|
||||
which_in,
|
||||
data_in,
|
||||
which_out,
|
||||
data_out,
|
||||
b_out,
|
||||
} = *self;
|
||||
en == other.en
|
||||
&& which_in == other.which_in
|
||||
&& data_in == other.data_in
|
||||
&& which_out == other.which_out
|
||||
&& data_out == other.data_out
|
||||
&& b_out.to_sim_value(BOutTy::TYPE) == other.b_out.to_sim_value(BOutTy::TYPE)
|
||||
}
|
||||
}
|
||||
let io_cycles = [
|
||||
IO {
|
||||
|
|
@ -397,6 +423,7 @@ fn test_enums() {
|
|||
data_in: 0,
|
||||
which_out: 0,
|
||||
data_out: 0,
|
||||
b_out: HdlNone(),
|
||||
},
|
||||
IO {
|
||||
en: true,
|
||||
|
|
@ -404,6 +431,7 @@ fn test_enums() {
|
|||
data_in: 0,
|
||||
which_out: 0,
|
||||
data_out: 0,
|
||||
b_out: HdlNone(),
|
||||
},
|
||||
IO {
|
||||
en: false,
|
||||
|
|
@ -411,6 +439,7 @@ fn test_enums() {
|
|||
data_in: 0,
|
||||
which_out: 1,
|
||||
data_out: 0,
|
||||
b_out: HdlSome((0_hdl_u1, false)),
|
||||
},
|
||||
IO {
|
||||
en: true,
|
||||
|
|
@ -418,6 +447,7 @@ fn test_enums() {
|
|||
data_in: 0xF,
|
||||
which_out: 1,
|
||||
data_out: 0,
|
||||
b_out: HdlSome((0_hdl_u1, false)),
|
||||
},
|
||||
IO {
|
||||
en: true,
|
||||
|
|
@ -425,6 +455,7 @@ fn test_enums() {
|
|||
data_in: 0xF,
|
||||
which_out: 1,
|
||||
data_out: 0x3,
|
||||
b_out: HdlSome((1_hdl_u1, true)),
|
||||
},
|
||||
IO {
|
||||
en: true,
|
||||
|
|
@ -432,6 +463,7 @@ fn test_enums() {
|
|||
data_in: 0xF,
|
||||
which_out: 1,
|
||||
data_out: 0x3,
|
||||
b_out: HdlSome((1_hdl_u1, true)),
|
||||
},
|
||||
IO {
|
||||
en: true,
|
||||
|
|
@ -439,6 +471,7 @@ fn test_enums() {
|
|||
data_in: 0xF,
|
||||
which_out: 2,
|
||||
data_out: 0xF,
|
||||
b_out: HdlNone(),
|
||||
},
|
||||
];
|
||||
for (
|
||||
|
|
@ -449,6 +482,7 @@ fn test_enums() {
|
|||
data_in,
|
||||
which_out: _,
|
||||
data_out: _,
|
||||
b_out: _,
|
||||
},
|
||||
) in io_cycles.into_iter().enumerate()
|
||||
{
|
||||
|
|
@ -469,6 +503,7 @@ fn test_enums() {
|
|||
.to_bigint()
|
||||
.try_into()
|
||||
.expect("known to be in range"),
|
||||
b_out: sim.read(sim.io().b_out).to_expr(),
|
||||
};
|
||||
assert_eq!(
|
||||
expected,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue