rust_hdl_widgets/i2c/
sim.rs1#[macro_export]
2macro_rules! i2c_begin_write {
3 ($sim: ident, $clock: ident, $uut: ident, $addr: expr) => {
4 $uut = $sim.watch(|x| !x.controller.busy.val(), $uut)?;
5 wait_clock_true!($sim, $clock, $uut);
6 $uut.controller.cmd.next = I2CControllerCmd::BeginWrite;
7 $uut.controller.write_data_in.next = ($addr as u32).to_bits();
8 $uut.controller.run.next = true;
9 wait_clock_cycle!($sim, $clock, $uut);
10 $uut.controller.run.next = false;
11 $uut = $sim.watch(|x| x.controller.nack.val() | x.controller.ack.val(), $uut)?;
12 };
13}
14
15#[macro_export]
16macro_rules! i2c_begin_read {
17 ($sim: ident, $clock: ident, $uut: ident, $addr: expr) => {
18 $uut = $sim.watch(|x| !x.controller.busy.val(), $uut)?;
19 wait_clock_true!($sim, $clock, $uut);
20 $uut.controller.cmd.next = I2CControllerCmd::BeginRead;
21 $uut.controller.write_data_in.next = ($addr as u32).to_bits();
22 $uut.controller.run.next = true;
23 wait_clock_cycle!($sim, $clock, $uut);
24 $uut.controller.run.next = false;
25 $uut = $sim.watch(|x| x.controller.nack.val() | x.controller.ack.val(), $uut)?;
26 };
27}
28
29#[macro_export]
30macro_rules! i2c_end_transmission {
31 ($sim: ident, $clock: ident, $uut: ident) => {
32 $uut = $sim.watch(|x| !x.controller.busy.val(), $uut)?;
33 wait_clock_true!($sim, $clock, $uut);
34 $uut.controller.cmd.next = I2CControllerCmd::EndTransmission;
35 $uut.controller.run.next = true;
36 wait_clock_cycle!($sim, $clock, $uut);
37 $uut.controller.run.next = false;
38 $uut = $sim.watch(|x| !x.controller.busy.val(), $uut)?;
39 wait_clock_cycles!($sim, $clock, $uut, 10);
40 };
41}
42
43#[macro_export]
44macro_rules! i2c_write {
45 ($sim: ident, $clock: ident, $uut: ident, $val: expr) => {
46 $uut = $sim.watch(|x| !x.controller.busy.val(), $uut)?;
47 wait_clock_true!($sim, $clock, $uut);
48 $uut.controller.cmd.next = I2CControllerCmd::Write;
49 $uut.controller.write_data_in.next = ($val as u32).to_bits();
50 $uut.controller.run.next = true;
51 wait_clock_cycle!($sim, $clock, $uut);
52 $uut.controller.run.next = false;
53 $uut = $sim.watch(|x| x.controller.nack.val() | x.controller.ack.val(), $uut)?;
54 };
55}
56
57#[macro_export]
58macro_rules! i2c_read {
59 ($sim: ident, $clock: ident, $uut: ident) => {{
60 $uut = $sim.watch(|x| !x.controller.busy.val(), $uut)?;
61 wait_clock_true!($sim, $clock, $uut);
62 $uut.controller.cmd.next = I2CControllerCmd::Read;
63 $uut.controller.run.next = true;
64 wait_clock_cycle!($sim, $clock, $uut);
65 $uut.controller.run.next = false;
66 $uut = $sim.watch(|x| x.controller.read_valid.val(), $uut)?;
67 $uut.controller.read_data_out.val()
68 }};
69}
70
71#[macro_export]
72macro_rules! i2c_read_last {
73 ($sim: ident, $clock: ident, $uut: ident) => {{
74 $uut = $sim.watch(|x| !x.controller.busy.val(), $uut)?;
75 wait_clock_true!($sim, $clock, $uut);
76 $uut.controller.cmd.next = I2CControllerCmd::ReadLast;
77 $uut.controller.run.next = true;
78 wait_clock_cycle!($sim, $clock, $uut);
79 $uut.controller.run.next = false;
80 $uut = $sim.watch(|x| x.controller.read_valid.val(), $uut)?;
81 $uut.controller.read_data_out.val()
82 }};
83}