Summary

csi2 (0/2)

build (fail)
          [INFO] Cloning "protocols"
[INFO] Cloning "ready_valid"
[INFO] Cloning "nstd"
[INFO] Building spade code
[ERROR] Failed to build spade code
Cloning into '/builds/spade-lang/trawler/work/csi2/build/libs/protocols'...
warning: redirecting to https://gitlab.com/spade-lang/lib/protocols.git/
HEAD is now at 3170518 Fix tests
Cloning into '/builds/spade-lang/trawler/work/csi2/build/libs/ready_valid'...
HEAD is now at d029c73 Bump Spade again
Cloning into '/builds/spade-lang/trawler/work/csi2/build/libs/nstd'...
HEAD is now at 92b6b79 Add pub markers
warning: The port keyword no longer has any effect on structs.
  ┌─ build/libs/ready_valid/src/main.spade:7:12
  │
7 │ pub struct port Rv<T> {
  │            ^^^^ struct port and struct are now the same thing
  │
  = Consider removing `port`
  │
7 │ pub struct port Rv<T> {
  │            ----

warning: The port keyword no longer has any effect on structs.
    ┌─ build/libs/ready_valid/src/main.spade:148:8
    │
148 │ struct port FifoOut<T> {
    │        ^^^^ struct port and struct are now the same thing
    │
    = Consider removing `port`
    │
148 │ struct port FifoOut<T> {
    │        ----

error: Unexpected `:`, expected `Identifier`
    ┌─ build/libs/ready_valid/src/main.spade:155:33
    │
155 │     pub fn read_empty(self, wire: inv &bool) -> FifoOut<T> {
    │                                 ^ expected `Identifier`

error: Unexpected `:`, expected `Identifier`
    ┌─ build/libs/ready_valid/src/main.spade:161:32
    │
161 │     pub fn read_full(self, wire: inv &bool) -> FifoOut<T> {
    │                                ^ expected `Identifier`

warning: Deprecated type-level function `uint_bits_to_fit`
  ┌─ build/libs/ready_valid/src/option_ext.spade:9:11
  │
9 │ where O: {uint_bits_to_fit(V) - 1},
  │           ^^^^^^^^^^^^^^^^
  │
  = Use `uint::bits_for` instead
  │
9 │ where O: {uint::bits_for(V) - 1},
  │           ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/ready_valid/src/option_ext.spade:10:11
   │
10 │       O: {uint_bits_to_fit(V - 1)}
   │           ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
10 │       O: {uint::bits_for(V - 1)}
   │           ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
  ┌─ build/libs/nstd/src/mem.spade:9:15
  │
9 │     where W: {uint_bits_to_fit(C)}
  │               ^^^^^^^^^^^^^^^^
  │
  = Use `uint::bits_for` instead
  │
9 │     where W: {uint::bits_for(C)}
  │               ~~~~~~~~~~~~~~

warning: Deprecated tuple syntax indexing
   ┌─ src/main.spade:61:27
   │
61 │             align0: match aligned#0 { Some(_) => true, None => false, },
   │                           ^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ src/main.spade:62:27
   │
62 │             align1: match aligned#1 { Some(_) => true, None => false, },
   │                           ^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/ready_valid/src/option_ext.spade:25:42
   │
25 │         let (write, read) = inst fifo::<{uint_bits_to_fit(Depth - 1)}, T, Depth>$(
   │                                          ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
25 │         let (write, read) = inst fifo::<{uint::bits_for(Depth - 1)}, T, Depth>$(
   │                                          ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
    ┌─ build/libs/ready_valid/src/main.spade:131:33
    │
131 │         reg(clk) timeout: uint<{uint_bits_to_fit(N)}> reset(rst: 0) =
    │                                 ^^^^^^^^^^^^^^^^
    │
    = Use `uint::bits_for` instead
    │
131 │         reg(clk) timeout: uint<{uint::bits_for(N)}> reset(rst: 0) =
    │                                 ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
    ┌─ build/libs/ready_valid/src/main.spade:241:50
    │
241 │       reg(clk) (array, num_left): ([T; N], uint<{uint_bits_to_fit(N)}>) reset(rst: (std::undef::undef(), 0)) =
    │                                                  ^^^^^^^^^^^^^^^^
    │
    = Use `uint::bits_for` instead
    │
241 │       reg(clk) (array, num_left): ([T; N], uint<{uint::bits_for(N)}>) reset(rst: (std::undef::undef(), 0)) =
    │                                                  ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/nstd/src/array.spade:70:19
   │
70 │     where NSize: {uint_bits_to_fit(N-1)}
   │                   ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
70 │     where NSize: {uint::bits_for(N-1)}
   │                   ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/nstd/src/array.spade:70:19
   │
70 │     where NSize: {uint_bits_to_fit(N-1)}
   │                   ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
70 │     where NSize: {uint::bits_for(N-1)}
   │                   ~~~~~~~~~~~~~~

error: Trait bound not satisfied. inv csi2::Csi2Debug does not implement core::Data
   ┌─ src/main.spade:35:5
   │    
35 │         dbg: inv &Csi2Debug
   │         ^^^
   │         │
   │         inv csi2::Csi2Debug does not implement core::Data
   │         The type of this argument is not Data which means it cannot be stored in a register.
36 │     ) -> FrontendOut {
   │ ╭────────────────────'
   │ │ ╭──────────────────'
37 │ │ │     reg * 2; // Domain crossing into the sysclk domain
38 │ │ │         let aligned = inst lane_aligner$(
39 │ │ │             sys_clk,
   · │ │
67 │ │ │         FrontendOut(short_packets, raw_pixels)
68 │ │ │ }
   │ ╰─│─' Required because of the trait bound specified here
   │   ╰─' The value needs to be in a register because it is in this pipeline
   │    
   = help: An value not being Data typically means it contains at least one `inv` type
   = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
   = Consider making the argument a wire
   │
35 │     wire dbg: inv &Csi2Debug
   │     +++++

Error: aborting due to previous error

Location:
    spade-compiler/src/main.rs:174:23
Error: 
   0: Failed to build spade code

Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.
Run with RUST_BACKTRACE=full to include source snippets.

        
test (fail)
          [INFO] Building spade code
[ERROR] Failed to build spade code
HEAD is now at 3170518 Fix tests
HEAD is now at d029c73 Bump Spade again
HEAD is now at 92b6b79 Add pub markers
warning: The port keyword no longer has any effect on structs.
  ┌─ build/libs/ready_valid/src/main.spade:7:12
  │
7 │ pub struct port Rv<T> {
  │            ^^^^ struct port and struct are now the same thing
  │
  = Consider removing `port`
  │
7 │ pub struct port Rv<T> {
  │            ----

warning: The port keyword no longer has any effect on structs.
    ┌─ build/libs/ready_valid/src/main.spade:148:8
    │
148 │ struct port FifoOut<T> {
    │        ^^^^ struct port and struct are now the same thing
    │
    = Consider removing `port`
    │
148 │ struct port FifoOut<T> {
    │        ----

error: Unexpected `:`, expected `Identifier`
    ┌─ build/libs/ready_valid/src/main.spade:155:33
    │
155 │     pub fn read_empty(self, wire: inv &bool) -> FifoOut<T> {
    │                                 ^ expected `Identifier`

error: Unexpected `:`, expected `Identifier`
    ┌─ build/libs/ready_valid/src/main.spade:161:32
    │
161 │     pub fn read_full(self, wire: inv &bool) -> FifoOut<T> {
    │                                ^ expected `Identifier`

warning: Deprecated type-level function `uint_bits_to_fit`
  ┌─ build/libs/ready_valid/src/option_ext.spade:9:11
  │
9 │ where O: {uint_bits_to_fit(V) - 1},
  │           ^^^^^^^^^^^^^^^^
  │
  = Use `uint::bits_for` instead
  │
9 │ where O: {uint::bits_for(V) - 1},
  │           ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/ready_valid/src/option_ext.spade:10:11
   │
10 │       O: {uint_bits_to_fit(V - 1)}
   │           ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
10 │       O: {uint::bits_for(V - 1)}
   │           ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
  ┌─ build/libs/nstd/src/mem.spade:9:15
  │
9 │     where W: {uint_bits_to_fit(C)}
  │               ^^^^^^^^^^^^^^^^
  │
  = Use `uint::bits_for` instead
  │
9 │     where W: {uint::bits_for(C)}
  │               ~~~~~~~~~~~~~~

warning: Deprecated tuple syntax indexing
   ┌─ src/main.spade:61:27
   │
61 │             align0: match aligned#0 { Some(_) => true, None => false, },
   │                           ^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ src/main.spade:62:27
   │
62 │             align1: match aligned#1 { Some(_) => true, None => false, },
   │                           ^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/ready_valid/src/option_ext.spade:25:42
   │
25 │         let (write, read) = inst fifo::<{uint_bits_to_fit(Depth - 1)}, T, Depth>$(
   │                                          ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
25 │         let (write, read) = inst fifo::<{uint::bits_for(Depth - 1)}, T, Depth>$(
   │                                          ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
    ┌─ build/libs/ready_valid/src/main.spade:131:33
    │
131 │         reg(clk) timeout: uint<{uint_bits_to_fit(N)}> reset(rst: 0) =
    │                                 ^^^^^^^^^^^^^^^^
    │
    = Use `uint::bits_for` instead
    │
131 │         reg(clk) timeout: uint<{uint::bits_for(N)}> reset(rst: 0) =
    │                                 ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
    ┌─ build/libs/ready_valid/src/main.spade:241:50
    │
241 │       reg(clk) (array, num_left): ([T; N], uint<{uint_bits_to_fit(N)}>) reset(rst: (std::undef::undef(), 0)) =
    │                                                  ^^^^^^^^^^^^^^^^
    │
    = Use `uint::bits_for` instead
    │
241 │       reg(clk) (array, num_left): ([T; N], uint<{uint::bits_for(N)}>) reset(rst: (std::undef::undef(), 0)) =
    │                                                  ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/nstd/src/array.spade:70:19
   │
70 │     where NSize: {uint_bits_to_fit(N-1)}
   │                   ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
70 │     where NSize: {uint::bits_for(N-1)}
   │                   ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/nstd/src/array.spade:70:19
   │
70 │     where NSize: {uint_bits_to_fit(N-1)}
   │                   ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
70 │     where NSize: {uint::bits_for(N-1)}
   │                   ~~~~~~~~~~~~~~

error: Trait bound not satisfied. inv csi2::Csi2Debug does not implement core::Data
   ┌─ src/main.spade:35:5
   │    
35 │         dbg: inv &Csi2Debug
   │         ^^^
   │         │
   │         inv csi2::Csi2Debug does not implement core::Data
   │         The type of this argument is not Data which means it cannot be stored in a register.
36 │     ) -> FrontendOut {
   │ ╭────────────────────'
   │ │ ╭──────────────────'
37 │ │ │     reg * 2; // Domain crossing into the sysclk domain
38 │ │ │         let aligned = inst lane_aligner$(
39 │ │ │             sys_clk,
   · │ │
67 │ │ │         FrontendOut(short_packets, raw_pixels)
68 │ │ │ }
   │ ╰─│─' Required because of the trait bound specified here
   │   ╰─' The value needs to be in a register because it is in this pipeline
   │    
   = help: An value not being Data typically means it contains at least one `inv` type
   = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
   = Consider making the argument a wire
   │
35 │     wire dbg: inv &Csi2Debug
   │     +++++

Error: aborting due to previous error

Location:
    spade-compiler/src/main.rs:174:23
Error: 
   0: Failed to build spade code

Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.
Run with RUST_BACKTRACE=full to include source snippets.

        

ecp5stubs (1/1)

build (success)
          
        

ethernet (0/1)

build (fail)
          [INFO] Cloning "ecp5stubs"
[INFO] Cloning "ready_valid"
[INFO] Cloning "nstd"
[INFO] Building spade code
[ERROR] Failed to build spade code
Cloning into '/builds/spade-lang/trawler/work/ethernet/build/libs/ecp5stubs'...
warning: redirecting to https://gitlab.com/spade-lang/lib/ecp5stubs.git/
HEAD is now at fe9f207 Make pll pub
Cloning into '/builds/spade-lang/trawler/work/ethernet/build/libs/ready_valid'...
HEAD is now at 30e51db Make escape_bytes public
Cloning into '/builds/spade-lang/trawler/work/ethernet/build/libs/nstd'...
HEAD is now at 3c294a8 Add chunks method to array
warning: The port keyword no longer has any effect on structs.
   ┌─ src/ip_tx.spade:52:12
   │
52 │ pub struct port IpStream<Checksum> {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
52 │ pub struct port IpStream<Checksum> {
   │            ----

warning: The port keyword no longer has any effect on structs.
   ┌─ src/ethernet_tx.spade:11:12
   │
11 │ pub struct port EthernetStream {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
11 │ pub struct port EthernetStream {
   │            ----

warning: The port keyword no longer has any effect on structs.
   ┌─ src/icmp_tx.spade:37:12
   │
37 │ pub struct port IcmpTx {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
37 │ pub struct port IcmpTx {
   │            ----

warning: The port keyword no longer has any effect on structs.
  ┌─ src/fifo_read_ext.spade:1:12
  │
1 │ pub struct port SlimFifoRead<D> {
  │            ^^^^ struct port and struct are now the same thing
  │
  = Consider removing `port`
  │
1 │ pub struct port SlimFifoRead<D> {
  │            ----

warning: The port keyword no longer has any effect on structs.
   ┌─ src/udp.spade:57:12
   │
57 │ pub struct port UdpStream {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
57 │ pub struct port UdpStream {
   │            ----

warning: The port keyword no longer has any effect on structs.
   ┌─ src/header_payload_tx_stream.spade:39:12
   │
39 │ pub struct port HeaderPayloadTxStream<Header> {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
39 │ pub struct port HeaderPayloadTxStream<Header> {
   │            ----

warning: The port keyword no longer has any effect on structs.
   ┌─ build/libs/ecp5stubs/src/pll.spade:70:12
   │
70 │ pub struct port SimplePllOut {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
70 │ pub struct port SimplePllOut {
   │            ----

warning: The port keyword no longer has any effect on structs.
  ┌─ build/libs/ready_valid/src/main.spade:7:12
  │
7 │ pub struct port Rv<T> {
  │            ^^^^ struct port and struct are now the same thing
  │
  = Consider removing `port`
  │
7 │ pub struct port Rv<T> {
  │            ----

warning: The port keyword no longer has any effect on structs.
    ┌─ build/libs/ready_valid/src/main.spade:148:8
    │
148 │ struct port FifoOut<T> {
    │        ^^^^ struct port and struct are now the same thing
    │
    = Consider removing `port`
    │
148 │ struct port FifoOut<T> {
    │        ----

error: Unexpected `:`, expected `Identifier`
    ┌─ build/libs/ready_valid/src/main.spade:155:33
    │
155 │     pub fn read_empty(self, wire: inv &bool) -> FifoOut<T> {
    │                                 ^ expected `Identifier`

error: Unexpected `:`, expected `Identifier`
    ┌─ build/libs/ready_valid/src/main.spade:161:32
    │
161 │     pub fn read_full(self, wire: inv &bool) -> FifoOut<T> {
    │                                ^ expected `Identifier`

warning: Deprecated type-level function `uint_bits_to_fit`
  ┌─ build/libs/nstd/src/mem.spade:9:15
  │
9 │     where W: {uint_bits_to_fit(C)}
  │               ^^^^^^^^^^^^^^^^
  │
  = Use `uint::bits_for` instead
  │
9 │     where W: {uint::bits_for(C)}
  │               ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
  ┌─ build/libs/ready_valid/src/option_ext.spade:9:11
  │
9 │ where O: {uint_bits_to_fit(V) - 1},
  │           ^^^^^^^^^^^^^^^^
  │
  = Use `uint::bits_for` instead
  │
9 │ where O: {uint::bits_for(V) - 1},
  │           ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/ready_valid/src/option_ext.spade:10:11
   │
10 │       O: {uint_bits_to_fit(V - 1)}
   │           ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
10 │       O: {uint::bits_for(V - 1)}
   │           ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ src/header_payload_rx_stream.spade:76:44
   │
76 │             : IntoFixedSizeHeaderState<N, {uint_bits_to_fit(N)}>
   │                                            ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
76 │             : IntoFixedSizeHeaderState<N, {uint::bits_for(N)}>
   │                                            ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/nstd/src/array.spade:70:19
   │
70 │     where NSize: {uint_bits_to_fit(N-1)}
   │                   ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
70 │     where NSize: {uint::bits_for(N-1)}
   │                   ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/nstd/src/array.spade:70:19
   │
70 │     where NSize: {uint_bits_to_fit(N-1)}
   │                   ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
70 │     where NSize: {uint::bits_for(N-1)}
   │                   ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/ready_valid/src/option_ext.spade:25:42
   │
25 │         let (write, read) = inst fifo::<{uint_bits_to_fit(Depth - 1)}, T, Depth>$(
   │                                          ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
25 │         let (write, read) = inst fifo::<{uint::bits_for(Depth - 1)}, T, Depth>$(
   │                                          ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
    ┌─ build/libs/ready_valid/src/main.spade:131:33
    │
131 │         reg(clk) timeout: uint<{uint_bits_to_fit(N)}> reset(rst: 0) =
    │                                 ^^^^^^^^^^^^^^^^
    │
    = Use `uint::bits_for` instead
    │
131 │         reg(clk) timeout: uint<{uint::bits_for(N)}> reset(rst: 0) =
    │                                 ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
    ┌─ build/libs/ready_valid/src/main.spade:241:50
    │
241 │       reg(clk) (array, num_left): ([T; N], uint<{uint_bits_to_fit(N)}>) reset(rst: (std::undef::undef(), 0)) =
    │                                                  ^^^^^^^^^^^^^^^^
    │
    = Use `uint::bits_for` instead
    │
241 │       reg(clk) (array, num_left): ([T; N], uint<{uint::bits_for(N)}>) reset(rst: (std::undef::undef(), 0)) =
    │                                                  ~~~~~~~~~~~~~~

error: Trait bound not satisfied. ethernet::ethernet_tx::EthernetStream does not implement core::Data
    ┌─ src/rgmii_tx.spade:76:61
    │    
 76 │     pipeline(3) into_ethernet_bytes_impl(clk: clock, rst: bool, s: EthernetStream) -> Option<EthernetByte> {
    │                                                                 ^
    │                                                                 │
    │                                                                 ethernet::ethernet_tx::EthernetStream does not implement core::Data
    │                                                                 The type of this argument is not Data which means it cannot be stored in a register.
    │ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────'
    │ │ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────'
 77 │ │ │         let EthernetStream(HeaderPayloadTxStream$(headers: header, bytes: payload_rv)) = s;
 78 │ │ │         let payload = *payload_rv.data;
 79 │ │ │ 
    · │ │
183 │ │ │         }
184 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An value not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the argument a wire
    │
 76 │ pipeline(3) into_ethernet_bytes_impl(clk: clock, rst: bool, wire s: EthernetStream) -> Option<EthernetByte> {
    │                                                             +++++

error: Trait bound not satisfied. inv ethernet::rgmii_rx::Debug does not implement core::Data
   ┌─ src/rgmii_rx.spade:17:5
   │    
17 │         debug: inv &Debug,
   │         ^^^^^
   │         │
   │         inv ethernet::rgmii_rx::Debug does not implement core::Data
   │         The type of this argument is not Data which means it cannot be stored in a register.
18 │     ) -> RgmiiRx {
   │ ╭────────────────'
   │ │ ╭──────────────'
19 │ │ │     let [data_valid, rxdv_xor_rxer] = inst iddrx1f(rx_clk, rst, rx_ctl).to_bits();
20 │ │ │     let data_err = rxdv_xor_rxer ^^ data_valid;
21 │ │ │ 
   · │ │
46 │ │ │     }
47 │ │ │ }
   │ ╰─│─' Required because of the trait bound specified here
   │   ╰─' The value needs to be in a register because it is in this pipeline
   │    
   = help: An value not being Data typically means it contains at least one `inv` type
   = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
   = Consider making the argument a wire
   │
17 │     wire debug: inv &Debug,
   │     +++++

Error: aborting due to previous error

Location:
    spade-compiler/src/main.rs:174:23
Error: 
   0: Failed to build spade code

Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.
Run with RUST_BACKTRACE=full to include source snippets.

        

fixed (1/1)

build (success)
          
        

mcp3002 (1/1)

build (success)
          
        

playground_blinky (1/1)

build (success)
          
        

playground_floppy_fish (0/1)

build (fail)
          [INFO] Cloning "fixed"
[INFO] Cloning "vga"
[INFO] Building spade code
[ERROR] Failed to build spade code
Cloning into '/builds/spade-lang/trawler/work/playground_floppy_fish/swim_floppy_fish/build/libs/fixed'...
warning: redirecting to https://gitlab.com/spade-lang/lib/fixed.git/
HEAD is now at 8adaa72 Bump Spade
Cloning into '/builds/spade-lang/trawler/work/playground_floppy_fish/swim_floppy_fish/build/libs/vga'...
warning: redirecting to https://gitlab.com/spade-lang/lib/vga_spade.git/
HEAD is now at d3cd108 Bump Spade
error: Trait bound not satisfied. inv bool does not implement core::Data
    ┌─ src/main.spade:98:3
    │    
 98 │       game_over: inv &bool,
    │       ^^^^^^^^^
    │       │
    │       inv bool does not implement core::Data
    │       The type of this argument is not Data which means it cannot be stored in a register.
 99 │     ) -> Color {
    │ ╭──────────────'
    │ │ ╭────────────'
100 │ │ │     let player_size = 32;
101 │ │ │     let pipe_gap = 90;
102 │ │ │     let player_in_y = y > sext(player_pos.to_int()) && y < sext(player_pos.to_int() + player_size);
    · │ │
126 │ │ │     color
127 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An value not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the argument a wire
    │
 98 │   wire game_over: inv &bool,
    │   +++++

error: Type of expression is not fully known
   ┌─ build/libs/fixed/src/main.spade:75:46
   │
75 │         if guard_bits == 0 || guard_bits == ~0 {
   │                                              ^ The type of this expression is not fully known
   │
   = note: Found incomplete type: Number<_> + core::ops::BitNot

Error: aborting due to previous error

Location:
    spade-compiler/src/main.rs:174:23
Error: 
   0: Failed to build spade code

Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.
Run with RUST_BACKTRACE=full to include source snippets.

        

playground_tinytapeout (1/1)

build (success)
          
        

playground_vga (1/1)

build (success)
          
        

protocols (2/2)

build (success)
          
        
test (success)
          
        

quickscope (0/1)

build (fail)
          [INFO] Cloning "protocols"
[INFO] Cloning "ready_valid"
[INFO] Cloning "nstd"
[INFO] Building spade code
[ERROR] Failed to build spade code
Cloning into '/builds/spade-lang/trawler/work/quickscope/build/libs/protocols'...
HEAD is now at 3170518 Fix tests
Cloning into '/builds/spade-lang/trawler/work/quickscope/build/libs/ready_valid'...
HEAD is now at 30e51db Make escape_bytes public
Cloning into '/builds/spade-lang/trawler/work/quickscope/build/libs/nstd'...
HEAD is now at 92b6b79 Add pub markers
warning: The port keyword no longer has any effect on structs.
  ┌─ build/libs/ready_valid/src/main.spade:7:12
  │
7 │ pub struct port Rv<T> {
  │            ^^^^ struct port and struct are now the same thing
  │
  = Consider removing `port`
  │
7 │ pub struct port Rv<T> {
  │            ----

warning: The port keyword no longer has any effect on structs.
    ┌─ build/libs/ready_valid/src/main.spade:148:8
    │
148 │ struct port FifoOut<T> {
    │        ^^^^ struct port and struct are now the same thing
    │
    = Consider removing `port`
    │
148 │ struct port FifoOut<T> {
    │        ----

error: Unexpected `:`, expected `Identifier`
    ┌─ build/libs/ready_valid/src/main.spade:155:33
    │
155 │     pub fn read_empty(self, wire: inv &bool) -> FifoOut<T> {
    │                                 ^ expected `Identifier`

error: Unexpected `:`, expected `Identifier`
    ┌─ build/libs/ready_valid/src/main.spade:161:32
    │
161 │     pub fn read_full(self, wire: inv &bool) -> FifoOut<T> {
    │                                ^ expected `Identifier`

warning: Deprecated type-level function `uint_bits_to_fit`
  ┌─ build/libs/ready_valid/src/option_ext.spade:9:11
  │
9 │ where O: {uint_bits_to_fit(V) - 1},
  │           ^^^^^^^^^^^^^^^^
  │
  = Use `uint::bits_for` instead
  │
9 │ where O: {uint::bits_for(V) - 1},
  │           ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/ready_valid/src/option_ext.spade:10:11
   │
10 │       O: {uint_bits_to_fit(V - 1)}
   │           ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
10 │       O: {uint::bits_for(V - 1)}
   │           ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
  ┌─ build/libs/nstd/src/mem.spade:9:15
  │
9 │     where W: {uint_bits_to_fit(C)}
  │               ^^^^^^^^^^^^^^^^
  │
  = Use `uint::bits_for` instead
  │
9 │     where W: {uint::bits_for(C)}
  │               ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/ready_valid/src/option_ext.spade:25:42
   │
25 │         let (write, read) = inst fifo::<{uint_bits_to_fit(Depth - 1)}, T, Depth>$(
   │                                          ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
25 │         let (write, read) = inst fifo::<{uint::bits_for(Depth - 1)}, T, Depth>$(
   │                                          ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
    ┌─ build/libs/ready_valid/src/main.spade:131:33
    │
131 │         reg(clk) timeout: uint<{uint_bits_to_fit(N)}> reset(rst: 0) =
    │                                 ^^^^^^^^^^^^^^^^
    │
    = Use `uint::bits_for` instead
    │
131 │         reg(clk) timeout: uint<{uint::bits_for(N)}> reset(rst: 0) =
    │                                 ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
    ┌─ build/libs/ready_valid/src/main.spade:241:50
    │
241 │       reg(clk) (array, num_left): ([T; N], uint<{uint_bits_to_fit(N)}>) reset(rst: (std::undef::undef(), 0)) =
    │                                                  ^^^^^^^^^^^^^^^^
    │
    = Use `uint::bits_for` instead
    │
241 │       reg(clk) (array, num_left): ([T; N], uint<{uint::bits_for(N)}>) reset(rst: (std::undef::undef(), 0)) =
    │                                                  ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/nstd/src/array.spade:70:19
   │
70 │     where NSize: {uint_bits_to_fit(N-1)}
   │                   ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
70 │     where NSize: {uint::bits_for(N-1)}
   │                   ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/nstd/src/array.spade:70:19
   │
70 │     where NSize: {uint_bits_to_fit(N-1)}
   │                   ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
70 │     where NSize: {uint::bits_for(N-1)}
   │                   ~~~~~~~~~~~~~~

error: _ has no method `into_element_stream`
   ┌─ src/main.spade:52:4
   │  
52 │ ╭    Rv(&data_in, ready.1)
53 │ │       .inst fifo_buffer::<SampleBuffer>(clk, rst)
54 │ │       .read_empty(empty.1)
55 │ │       .data
   · │
58 │ │       })
59 │ │       .inst into_element_stream(clk, rst)
   │ ╰─────────────────────────────────────────^

error: `ready_valid::FifoOut<core::Data>` has no method `read_empty`
   ┌─ src/main.spade:54:8
   │  
52 │ ╭    Rv(&data_in, ready.1)
53 │ │       .inst fifo_buffer::<SampleBuffer>(clk, rst)
54 │ │       .read_empty(empty.1)
   │ │        ^^^^^^^^^^ No such method
   │ ╰──────────────────────────' This has type `ready_valid::FifoOut<core::Data>`

error: Field access on {unknown} which is not a struct
   ┌─ src/main.spade:52:4
   │  
52 │ ╭    Rv(&data_in, ready.1)
53 │ │       .inst fifo_buffer::<SampleBuffer>(clk, rst)
54 │ │       .read_empty(empty.1)
   │ ╰──────────────────────────^ Expected a struct, found {unknown}
   │  
   = help: Field access is only allowed on structs

Error: aborting due to previous error

Location:
    spade-compiler/src/main.rs:174:23
Error: 
   0: Failed to build spade code

Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.
Run with RUST_BACKTRACE=full to include source snippets.

        

ready_valid (1/1)

build (success)
          
        

spade-v (0/2)

build (fail)
          [INFO] Cloning "protocols"
[INFO] Cloning "ready_valid"
[INFO] Cloning "nstd"
[INFO] Building spade code
[ERROR] Failed to build spade code
Cloning into '/builds/spade-lang/trawler/work/spade-v/build/libs/protocols'...
HEAD is now at 3170518 Fix tests
Cloning into '/builds/spade-lang/trawler/work/spade-v/build/libs/ready_valid'...
HEAD is now at d029c73 Bump Spade again
Cloning into '/builds/spade-lang/trawler/work/spade-v/build/libs/nstd'...
HEAD is now at 92b6b79 Add pub markers
warning: The port keyword no longer has any effect on structs.
   ┌─ src/csr.spade:10:12
   │
10 │ pub struct port CsrInterface {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
10 │ pub struct port CsrInterface {
   │            ----

warning: The port keyword no longer has any effect on structs.
   ┌─ src/bus.spade:45:12
   │
45 │ pub struct port Bus {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
45 │ pub struct port Bus {
   │            ----

warning: The port keyword no longer has any effect on structs.
   ┌─ src/bus.spade:52:12
   │
52 │ pub struct port Buses {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
52 │ pub struct port Buses {
   │            ----

warning: The port keyword no longer has any effect on structs.
  ┌─ src/regfile.spade:5:12
  │
5 │ pub struct port RegfilePort {
  │            ^^^^ struct port and struct are now the same thing
  │
  = Consider removing `port`
  │
5 │ pub struct port RegfilePort {
  │            ----

warning: The port keyword no longer has any effect on structs.
  ┌─ build/libs/ready_valid/src/main.spade:7:12
  │
7 │ pub struct port Rv<T> {
  │            ^^^^ struct port and struct are now the same thing
  │
  = Consider removing `port`
  │
7 │ pub struct port Rv<T> {
  │            ----

warning: The port keyword no longer has any effect on structs.
    ┌─ build/libs/ready_valid/src/main.spade:148:8
    │
148 │ struct port FifoOut<T> {
    │        ^^^^ struct port and struct are now the same thing
    │
    = Consider removing `port`
    │
148 │ struct port FifoOut<T> {
    │        ----

error: Unexpected `:`, expected `Identifier`
    ┌─ build/libs/ready_valid/src/main.spade:155:33
    │
155 │     pub fn read_empty(self, wire: inv &bool) -> FifoOut<T> {
    │                                 ^ expected `Identifier`

error: Unexpected `:`, expected `Identifier`
    ┌─ build/libs/ready_valid/src/main.spade:161:32
    │
161 │     pub fn read_full(self, wire: inv &bool) -> FifoOut<T> {
    │                                ^ expected `Identifier`

warning: Deprecated type-level function `uint_bits_to_fit`
  ┌─ build/libs/ready_valid/src/option_ext.spade:9:11
  │
9 │ where O: {uint_bits_to_fit(V) - 1},
  │           ^^^^^^^^^^^^^^^^
  │
  = Use `uint::bits_for` instead
  │
9 │ where O: {uint::bits_for(V) - 1},
  │           ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/ready_valid/src/option_ext.spade:10:11
   │
10 │       O: {uint_bits_to_fit(V - 1)}
   │           ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
10 │       O: {uint::bits_for(V - 1)}
   │           ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
  ┌─ build/libs/nstd/src/mem.spade:9:15
  │
9 │     where W: {uint_bits_to_fit(C)}
  │               ^^^^^^^^^^^^^^^^
  │
  = Use `uint::bits_for` instead
  │
9 │     where W: {uint::bits_for(C)}
  │               ~~~~~~~~~~~~~~

warning: Deprecated tuple syntax indexing
   ┌─ src/memory.spade:28:54
   │
28 │         Command::Write(write_data) => (zext(addr) >= range#0 && zext(addr) < range#1, write_data),
   │                                                      ^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ src/memory.spade:28:78
   │
28 │         Command::Write(write_data) => (zext(addr) >= range#0 && zext(addr) < range#1, write_data),
   │                                                                              ^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ src/memory.spade:31:27
   │
31 │     let addr = addr-trunc(range#0);
   │                           ^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:106:17
    │
106 │         assert (range#1 - range#0) == 16384;
    │                 ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:106:27
    │
106 │         assert (range#1 - range#0) == 16384;
    │                           ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:109:41
    │
109 │             split_control_write_signals(buses#0, range), 
    │                                         ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:110:41
    │
110 │             split_control_write_signals(buses#1, range)
    │                                         ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:112:85
    │
112 │         let MemorySignals$(write_ports: wp0, addr_first_bits: _, access_width: _) = mem_signals#0;
    │                                                                                     ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:113:85
    │
113 │         let MemorySignals$(write_ports: wp1, addr_first_bits: _, access_width: _) = mem_signals#1;
    │                                                                                     ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:116:22
    │
116 │         assert match buses#1.cmd {Command::Read => true, Command::Nop => true, _ => false};
    │                      ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:125:46
    │
125 │         let data1_0 = inst read_memory(mem0, wp0[0]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:126:46
    │
126 │         let data1_1 = inst read_memory(mem1, wp0[1]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:127:46
    │
127 │         let data1_2 = inst read_memory(mem2, wp0[2]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:128:46
    │
128 │         let data1_3 = inst read_memory(mem3, wp0[3]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:130:46
    │
130 │         let data2_0 = inst read_memory(mem0, wp1[0]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:131:46
    │
131 │         let data2_1 = inst read_memory(mem1, wp1[1]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:132:46
    │
132 │         let data2_2 = inst read_memory(mem2, wp1[2]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:133:46
    │
133 │         let data2_3 = inst read_memory(mem3, wp1[3]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:137:26
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                          ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:137:35
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                                   ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:137:67
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                                                                   ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:137:76
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                                                                            ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/bus.spade:166:12
    │
166 │     assert region#1 > region#0;
    │            ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/bus.spade:166:23
    │
166 │     assert region#1 > region#0;
    │                       ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/ready_valid/src/option_ext.spade:25:42
   │
25 │         let (write, read) = inst fifo::<{uint_bits_to_fit(Depth - 1)}, T, Depth>$(
   │                                          ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
25 │         let (write, read) = inst fifo::<{uint::bits_for(Depth - 1)}, T, Depth>$(
   │                                          ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
    ┌─ build/libs/ready_valid/src/main.spade:131:33
    │
131 │         reg(clk) timeout: uint<{uint_bits_to_fit(N)}> reset(rst: 0) =
    │                                 ^^^^^^^^^^^^^^^^
    │
    = Use `uint::bits_for` instead
    │
131 │         reg(clk) timeout: uint<{uint::bits_for(N)}> reset(rst: 0) =
    │                                 ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
    ┌─ build/libs/ready_valid/src/main.spade:241:50
    │
241 │       reg(clk) (array, num_left): ([T; N], uint<{uint_bits_to_fit(N)}>) reset(rst: (std::undef::undef(), 0)) =
    │                                                  ^^^^^^^^^^^^^^^^
    │
    = Use `uint::bits_for` instead
    │
241 │       reg(clk) (array, num_left): ([T; N], uint<{uint::bits_for(N)}>) reset(rst: (std::undef::undef(), 0)) =
    │                                                  ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/nstd/src/array.spade:70:19
   │
70 │     where NSize: {uint_bits_to_fit(N-1)}
   │                   ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
70 │     where NSize: {uint::bits_for(N-1)}
   │                   ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/nstd/src/array.spade:70:19
   │
70 │     where NSize: {uint_bits_to_fit(N-1)}
   │                   ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
70 │     where NSize: {uint::bits_for(N-1)}
   │                   ~~~~~~~~~~~~~~

error: Trait bound not satisfied. spadev::bus::Buses does not implement core::Data
    ┌─ src/cpu.spade:46:5
    │    
 46 │         buses: Buses,
    │         ^^^^^
    │         │
    │         spadev::bus::Buses does not implement core::Data
    │         The type of this argument is not Data which means it cannot be stored in a register.
    ·    
 52 │ ╭ ╭ {
 53 │ │ │         'pc
 54 │ │ │ 
 55 │ │ │         let NOP = 0x00000013;
    · │ │
244 │ │ │         )
245 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An value not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the argument a wire
    │
 46 │     wire buses: Buses,
    │     +++++

error: Trait bound not satisfied. spadev::bus::Bus does not implement core::Data
    ┌─ src/cpu.spade:278:5
    │    
278 │         bus: Bus,
    │         ^^^
    │         │
    │         spadev::bus::Bus does not implement core::Data
    │         The type of this argument is not Data which means it cannot be stored in a register.
    ·    
282 │     ) -> uint<32> {
    │ ╭─────────────────'
    │ │ ╭───────────────'
283 │ │ │         let write_data = rs2;
284 │ │ │ 
285 │ │ │         let (access_width, memory_command) = match op {
    · │ │
305 │ │ │         *bus.result
306 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An value not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the argument a wire
    │
278 │     wire bus: Bus,
    │     +++++

error: Trait bound not satisfied. spadev::bus::Bus does not implement core::Data
    ┌─ src/cpu.spade:308:38
    │    
308 │     pipeline(1) set_insn_bus(clk: clock, bus: Bus, pc_option: Option<uint<32>>) -> uint<32> {
    │                                          ^^^
    │                                          │
    │                                          spadev::bus::Bus does not implement core::Data
    │                                          The type of this argument is not Data which means it cannot be stored in a register.
    │ ╭───────────────────────────────────────────────────────────────────────────────────────────'
    │ │ ╭─────────────────────────────────────────────────────────────────────────────────────────'
309 │ │ │         set bus.control = &ControlSignals$(
310 │ │ │             access_width: AccessWidth::Full(),
311 │ │ │             addr: match pc_option {
    · │ │
321 │ │ │         *bus.result
322 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An value not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the argument a wire
    │
308 │ pipeline(1) set_insn_bus(clk: clock, wire bus: Bus, pc_option: Option<uint<32>>) -> uint<32> {
    │                                      +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ src/memory.spade:120:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
120 │ │ │         let mem0: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[0]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
120 │         let wire mem0: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[0]]);
    │             +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ src/memory.spade:121:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
121 │ │ │         let mem1: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[1]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
121 │         let wire mem1: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[1]]);
    │             +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ src/memory.spade:122:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
122 │ │ │         let mem2: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[2]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
122 │         let wire mem2: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[2]]);
    │             +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ src/memory.spade:123:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
123 │ │ │         let mem3: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[3]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
123 │         let wire mem3: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[3]]);
    │             +++++

error: Trait bound not satisfied. inv spadev::bus::ControlSignals does not implement core::Data
    ┌─ src/bus.spade:69:13
    │    
 68 │     pub(lib) pipeline(1) test_bus(clk: clock, load_signals: ProgramLoadSignals) -> Buses {
    │ ╭────────────────────────────────────────────────────────────────────────────────────────'
    │ │ ╭──────────────────────────────────────────────────────────────────────────────────────'
 69 │ │ │         let data_control = inst new_mut_wire();
    │ │ │             ^^^^^^^^^^^^
    │ │ │             │
    │ │ │             inv spadev::bus::ControlSignals does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
 70 │ │ │         let insn_control = inst new_mut_wire();
 71 │ │ │ 
    · │ │
110 │ │ │         )
111 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
 69 │         let wire data_control = inst new_mut_wire();
    │             +++++

error: Trait bound not satisfied. inv spadev::bus::ControlSignals does not implement core::Data
    ┌─ src/bus.spade:70:13
    │    
 68 │     pub(lib) pipeline(1) test_bus(clk: clock, load_signals: ProgramLoadSignals) -> Buses {
    │ ╭────────────────────────────────────────────────────────────────────────────────────────'
    │ │ ╭──────────────────────────────────────────────────────────────────────────────────────'
 69 │ │ │         let data_control = inst new_mut_wire();
 70 │ │ │         let insn_control = inst new_mut_wire();
    │ │ │             ^^^^^^^^^^^^
    │ │ │             │
    │ │ │             inv spadev::bus::ControlSignals does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
 71 │ │ │ 
    · │ │
110 │ │ │         )
111 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
 70 │         let wire insn_control = inst new_mut_wire();
    │             +++++

error: Trait bound not satisfied. spadev::regfile::RegfilePort does not implement core::Data
   ┌─ src/regfile.spade:14:5
   │    
14 │         regfile: RegfilePort,
   │         ^^^^^^^
   │         │
   │         spadev::regfile::RegfilePort does not implement core::Data
   │         The type of this argument is not Data which means it cannot be stored in a register.
   ·    
18 │     ) -> (int<32>, int<32>) {
   │ ╭───────────────────────────'
   │ │ ╭─────────────────────────'
19 │ │ │         set regfile.write = &write;
20 │ │ │         set regfile.idxa = &idxa;
21 │ │ │         set regfile.idxb = &idxb;
22 │ │ │     reg;
23 │ │ │         *regfile.read
24 │ │ │ }
   │ ╰─│─' Required because of the trait bound specified here
   │   ╰─' The value needs to be in a register because it is in this pipeline
   │    
   = help: An value not being Data typically means it contains at least one `inv` type
   = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
   = Consider making the argument a wire
   │
14 │     wire regfile: RegfilePort,
   │     +++++

error: Trait bound not satisfied. Memory<int<32>, _> does not implement core::Data
   ┌─ src/regfile.spade:38:13
   │    
31 │     ) -> (int<32>, int<32>) {
   │ ╭───────────────────────────'
   │ │ ╭─────────────────────────'
32 │ │ │         let (we, dreg, dval) = match write {
33 │ │ │             Option::Some((dreg, dval)) => (true, dreg, dval),
34 │ │ │             // NOTE: We really need to add a way to specify don't care here
   · │ │
38 │ │ │         let regs: Memory<int<32>, N> = inst clocked_memory(clk, [(we, trunc(dreg), dval)]);
   │ │ │             ^^^^
   │ │ │             │
   │ │ │             Memory<int<32>, _> does not implement core::Data
   │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
   · │ │
48 │ │ │         )
49 │ │ │ }
   │ ╰─│─' Required because of the trait bound specified here
   │   ╰─' The value needs to be in a register because it is in this pipeline
   │    
   = help: An expression not being Data typically means it contains at least one `inv` type
   = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
   = Consider making the binding a wire
   │
38 │         let wire regs: Memory<int<32>, N> = inst clocked_memory(clk, [(we, trunc(dreg), dval)]);
   │             +++++

Error: aborting due to previous error

Location:
    spade-compiler/src/main.rs:174:23
Error: 
   0: Failed to build spade code

Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.
Run with RUST_BACKTRACE=full to include source snippets.

        
test (fail)
          [INFO] Building spade code
[ERROR] Failed to build spade code
HEAD is now at 3170518 Fix tests
HEAD is now at d029c73 Bump Spade again
HEAD is now at 92b6b79 Add pub markers
warning: The port keyword no longer has any effect on structs.
   ┌─ src/csr.spade:10:12
   │
10 │ pub struct port CsrInterface {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
10 │ pub struct port CsrInterface {
   │            ----

warning: The port keyword no longer has any effect on structs.
   ┌─ src/bus.spade:45:12
   │
45 │ pub struct port Bus {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
45 │ pub struct port Bus {
   │            ----

warning: The port keyword no longer has any effect on structs.
   ┌─ src/bus.spade:52:12
   │
52 │ pub struct port Buses {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
52 │ pub struct port Buses {
   │            ----

warning: The port keyword no longer has any effect on structs.
  ┌─ src/regfile.spade:5:12
  │
5 │ pub struct port RegfilePort {
  │            ^^^^ struct port and struct are now the same thing
  │
  = Consider removing `port`
  │
5 │ pub struct port RegfilePort {
  │            ----

warning: The port keyword no longer has any effect on structs.
  ┌─ build/libs/ready_valid/src/main.spade:7:12
  │
7 │ pub struct port Rv<T> {
  │            ^^^^ struct port and struct are now the same thing
  │
  = Consider removing `port`
  │
7 │ pub struct port Rv<T> {
  │            ----

warning: The port keyword no longer has any effect on structs.
    ┌─ build/libs/ready_valid/src/main.spade:148:8
    │
148 │ struct port FifoOut<T> {
    │        ^^^^ struct port and struct are now the same thing
    │
    = Consider removing `port`
    │
148 │ struct port FifoOut<T> {
    │        ----

error: Unexpected `:`, expected `Identifier`
    ┌─ build/libs/ready_valid/src/main.spade:155:33
    │
155 │     pub fn read_empty(self, wire: inv &bool) -> FifoOut<T> {
    │                                 ^ expected `Identifier`

error: Unexpected `:`, expected `Identifier`
    ┌─ build/libs/ready_valid/src/main.spade:161:32
    │
161 │     pub fn read_full(self, wire: inv &bool) -> FifoOut<T> {
    │                                ^ expected `Identifier`

warning: Deprecated type-level function `uint_bits_to_fit`
  ┌─ build/libs/ready_valid/src/option_ext.spade:9:11
  │
9 │ where O: {uint_bits_to_fit(V) - 1},
  │           ^^^^^^^^^^^^^^^^
  │
  = Use `uint::bits_for` instead
  │
9 │ where O: {uint::bits_for(V) - 1},
  │           ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/ready_valid/src/option_ext.spade:10:11
   │
10 │       O: {uint_bits_to_fit(V - 1)}
   │           ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
10 │       O: {uint::bits_for(V - 1)}
   │           ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
  ┌─ build/libs/nstd/src/mem.spade:9:15
  │
9 │     where W: {uint_bits_to_fit(C)}
  │               ^^^^^^^^^^^^^^^^
  │
  = Use `uint::bits_for` instead
  │
9 │     where W: {uint::bits_for(C)}
  │               ~~~~~~~~~~~~~~

warning: Deprecated tuple syntax indexing
   ┌─ src/memory.spade:28:54
   │
28 │         Command::Write(write_data) => (zext(addr) >= range#0 && zext(addr) < range#1, write_data),
   │                                                      ^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ src/memory.spade:28:78
   │
28 │         Command::Write(write_data) => (zext(addr) >= range#0 && zext(addr) < range#1, write_data),
   │                                                                              ^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ src/memory.spade:31:27
   │
31 │     let addr = addr-trunc(range#0);
   │                           ^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:106:17
    │
106 │         assert (range#1 - range#0) == 16384;
    │                 ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:106:27
    │
106 │         assert (range#1 - range#0) == 16384;
    │                           ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:109:41
    │
109 │             split_control_write_signals(buses#0, range), 
    │                                         ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:110:41
    │
110 │             split_control_write_signals(buses#1, range)
    │                                         ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:112:85
    │
112 │         let MemorySignals$(write_ports: wp0, addr_first_bits: _, access_width: _) = mem_signals#0;
    │                                                                                     ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:113:85
    │
113 │         let MemorySignals$(write_ports: wp1, addr_first_bits: _, access_width: _) = mem_signals#1;
    │                                                                                     ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:116:22
    │
116 │         assert match buses#1.cmd {Command::Read => true, Command::Nop => true, _ => false};
    │                      ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:125:46
    │
125 │         let data1_0 = inst read_memory(mem0, wp0[0]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:126:46
    │
126 │         let data1_1 = inst read_memory(mem1, wp0[1]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:127:46
    │
127 │         let data1_2 = inst read_memory(mem2, wp0[2]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:128:46
    │
128 │         let data1_3 = inst read_memory(mem3, wp0[3]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:130:46
    │
130 │         let data2_0 = inst read_memory(mem0, wp1[0]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:131:46
    │
131 │         let data2_1 = inst read_memory(mem1, wp1[1]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:132:46
    │
132 │         let data2_2 = inst read_memory(mem2, wp1[2]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:133:46
    │
133 │         let data2_3 = inst read_memory(mem3, wp1[3]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:137:26
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                          ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:137:35
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                                   ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:137:67
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                                                                   ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/memory.spade:137:76
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                                                                            ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/bus.spade:166:12
    │
166 │     assert region#1 > region#0;
    │            ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ src/bus.spade:166:23
    │
166 │     assert region#1 > region#0;
    │                       ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/ready_valid/src/option_ext.spade:25:42
   │
25 │         let (write, read) = inst fifo::<{uint_bits_to_fit(Depth - 1)}, T, Depth>$(
   │                                          ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
25 │         let (write, read) = inst fifo::<{uint::bits_for(Depth - 1)}, T, Depth>$(
   │                                          ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
    ┌─ build/libs/ready_valid/src/main.spade:131:33
    │
131 │         reg(clk) timeout: uint<{uint_bits_to_fit(N)}> reset(rst: 0) =
    │                                 ^^^^^^^^^^^^^^^^
    │
    = Use `uint::bits_for` instead
    │
131 │         reg(clk) timeout: uint<{uint::bits_for(N)}> reset(rst: 0) =
    │                                 ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
    ┌─ build/libs/ready_valid/src/main.spade:241:50
    │
241 │       reg(clk) (array, num_left): ([T; N], uint<{uint_bits_to_fit(N)}>) reset(rst: (std::undef::undef(), 0)) =
    │                                                  ^^^^^^^^^^^^^^^^
    │
    = Use `uint::bits_for` instead
    │
241 │       reg(clk) (array, num_left): ([T; N], uint<{uint::bits_for(N)}>) reset(rst: (std::undef::undef(), 0)) =
    │                                                  ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/nstd/src/array.spade:70:19
   │
70 │     where NSize: {uint_bits_to_fit(N-1)}
   │                   ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
70 │     where NSize: {uint::bits_for(N-1)}
   │                   ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/nstd/src/array.spade:70:19
   │
70 │     where NSize: {uint_bits_to_fit(N-1)}
   │                   ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
70 │     where NSize: {uint::bits_for(N-1)}
   │                   ~~~~~~~~~~~~~~

error: Trait bound not satisfied. spadev::bus::Buses does not implement core::Data
    ┌─ src/cpu.spade:46:5
    │    
 46 │         buses: Buses,
    │         ^^^^^
    │         │
    │         spadev::bus::Buses does not implement core::Data
    │         The type of this argument is not Data which means it cannot be stored in a register.
    ·    
 52 │ ╭ ╭ {
 53 │ │ │         'pc
 54 │ │ │ 
 55 │ │ │         let NOP = 0x00000013;
    · │ │
244 │ │ │         )
245 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An value not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the argument a wire
    │
 46 │     wire buses: Buses,
    │     +++++

error: Trait bound not satisfied. spadev::bus::Bus does not implement core::Data
    ┌─ src/cpu.spade:278:5
    │    
278 │         bus: Bus,
    │         ^^^
    │         │
    │         spadev::bus::Bus does not implement core::Data
    │         The type of this argument is not Data which means it cannot be stored in a register.
    ·    
282 │     ) -> uint<32> {
    │ ╭─────────────────'
    │ │ ╭───────────────'
283 │ │ │         let write_data = rs2;
284 │ │ │ 
285 │ │ │         let (access_width, memory_command) = match op {
    · │ │
305 │ │ │         *bus.result
306 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An value not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the argument a wire
    │
278 │     wire bus: Bus,
    │     +++++

error: Trait bound not satisfied. spadev::bus::Bus does not implement core::Data
    ┌─ src/cpu.spade:308:38
    │    
308 │     pipeline(1) set_insn_bus(clk: clock, bus: Bus, pc_option: Option<uint<32>>) -> uint<32> {
    │                                          ^^^
    │                                          │
    │                                          spadev::bus::Bus does not implement core::Data
    │                                          The type of this argument is not Data which means it cannot be stored in a register.
    │ ╭───────────────────────────────────────────────────────────────────────────────────────────'
    │ │ ╭─────────────────────────────────────────────────────────────────────────────────────────'
309 │ │ │         set bus.control = &ControlSignals$(
310 │ │ │             access_width: AccessWidth::Full(),
311 │ │ │             addr: match pc_option {
    · │ │
321 │ │ │         *bus.result
322 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An value not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the argument a wire
    │
308 │ pipeline(1) set_insn_bus(clk: clock, wire bus: Bus, pc_option: Option<uint<32>>) -> uint<32> {
    │                                      +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ src/memory.spade:120:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
120 │ │ │         let mem0: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[0]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
120 │         let wire mem0: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[0]]);
    │             +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ src/memory.spade:121:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
121 │ │ │         let mem1: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[1]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
121 │         let wire mem1: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[1]]);
    │             +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ src/memory.spade:122:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
122 │ │ │         let mem2: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[2]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
122 │         let wire mem2: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[2]]);
    │             +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ src/memory.spade:123:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
123 │ │ │         let mem3: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[3]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
123 │         let wire mem3: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[3]]);
    │             +++++

error: Trait bound not satisfied. inv spadev::bus::ControlSignals does not implement core::Data
    ┌─ src/bus.spade:69:13
    │    
 68 │     pub(lib) pipeline(1) test_bus(clk: clock, load_signals: ProgramLoadSignals) -> Buses {
    │ ╭────────────────────────────────────────────────────────────────────────────────────────'
    │ │ ╭──────────────────────────────────────────────────────────────────────────────────────'
 69 │ │ │         let data_control = inst new_mut_wire();
    │ │ │             ^^^^^^^^^^^^
    │ │ │             │
    │ │ │             inv spadev::bus::ControlSignals does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
 70 │ │ │         let insn_control = inst new_mut_wire();
 71 │ │ │ 
    · │ │
110 │ │ │         )
111 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
 69 │         let wire data_control = inst new_mut_wire();
    │             +++++

error: Trait bound not satisfied. inv spadev::bus::ControlSignals does not implement core::Data
    ┌─ src/bus.spade:70:13
    │    
 68 │     pub(lib) pipeline(1) test_bus(clk: clock, load_signals: ProgramLoadSignals) -> Buses {
    │ ╭────────────────────────────────────────────────────────────────────────────────────────'
    │ │ ╭──────────────────────────────────────────────────────────────────────────────────────'
 69 │ │ │         let data_control = inst new_mut_wire();
 70 │ │ │         let insn_control = inst new_mut_wire();
    │ │ │             ^^^^^^^^^^^^
    │ │ │             │
    │ │ │             inv spadev::bus::ControlSignals does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
 71 │ │ │ 
    · │ │
110 │ │ │         )
111 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
 70 │         let wire insn_control = inst new_mut_wire();
    │             +++++

error: Trait bound not satisfied. spadev::regfile::RegfilePort does not implement core::Data
   ┌─ src/regfile.spade:14:5
   │    
14 │         regfile: RegfilePort,
   │         ^^^^^^^
   │         │
   │         spadev::regfile::RegfilePort does not implement core::Data
   │         The type of this argument is not Data which means it cannot be stored in a register.
   ·    
18 │     ) -> (int<32>, int<32>) {
   │ ╭───────────────────────────'
   │ │ ╭─────────────────────────'
19 │ │ │         set regfile.write = &write;
20 │ │ │         set regfile.idxa = &idxa;
21 │ │ │         set regfile.idxb = &idxb;
22 │ │ │     reg;
23 │ │ │         *regfile.read
24 │ │ │ }
   │ ╰─│─' Required because of the trait bound specified here
   │   ╰─' The value needs to be in a register because it is in this pipeline
   │    
   = help: An value not being Data typically means it contains at least one `inv` type
   = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
   = Consider making the argument a wire
   │
14 │     wire regfile: RegfilePort,
   │     +++++

error: Trait bound not satisfied. Memory<int<32>, _> does not implement core::Data
   ┌─ src/regfile.spade:38:13
   │    
31 │     ) -> (int<32>, int<32>) {
   │ ╭───────────────────────────'
   │ │ ╭─────────────────────────'
32 │ │ │         let (we, dreg, dval) = match write {
33 │ │ │             Option::Some((dreg, dval)) => (true, dreg, dval),
34 │ │ │             // NOTE: We really need to add a way to specify don't care here
   · │ │
38 │ │ │         let regs: Memory<int<32>, N> = inst clocked_memory(clk, [(we, trunc(dreg), dval)]);
   │ │ │             ^^^^
   │ │ │             │
   │ │ │             Memory<int<32>, _> does not implement core::Data
   │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
   · │ │
48 │ │ │         )
49 │ │ │ }
   │ ╰─│─' Required because of the trait bound specified here
   │   ╰─' The value needs to be in a register because it is in this pipeline
   │    
   = help: An expression not being Data typically means it contains at least one `inv` type
   = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
   = Consider making the binding a wire
   │
38 │         let wire regs: Memory<int<32>, N> = inst clocked_memory(clk, [(we, trunc(dreg), dval)]);
   │             +++++

Error: aborting due to previous error

Location:
    spade-compiler/src/main.rs:174:23
Error: 
   0: Failed to build spade code

Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.
Run with RUST_BACKTRACE=full to include source snippets.

        

spade-v-hwtest-uart (0/3)

build (fail)
          [WARN] swim.toml contains 1 unknown field:
[WARN]   synthesis.?.extra_verilog
[INFO] Cloning "protocols"
[INFO] Cloning "ready_valid"
[INFO] Cloning "nstd"
[INFO] Building spade code
[ERROR] Failed to build spade code
Cloning into '/builds/spade-lang/trawler/work/spade-v-hwtest-uart/hwtest_uart/build/libs/protocols'...
HEAD is now at 3170518 Fix tests
Cloning into '/builds/spade-lang/trawler/work/spade-v-hwtest-uart/hwtest_uart/build/libs/ready_valid'...
HEAD is now at d029c73 Bump Spade again
Cloning into '/builds/spade-lang/trawler/work/spade-v-hwtest-uart/hwtest_uart/build/libs/nstd'...
HEAD is now at 92b6b79 Add pub markers
warning: The port keyword no longer has any effect on structs.
   ┌─ ../src/csr.spade:10:12
   │
10 │ pub struct port CsrInterface {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
10 │ pub struct port CsrInterface {
   │            ----

warning: The port keyword no longer has any effect on structs.
   ┌─ ../src/bus.spade:45:12
   │
45 │ pub struct port Bus {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
45 │ pub struct port Bus {
   │            ----

warning: The port keyword no longer has any effect on structs.
   ┌─ ../src/bus.spade:52:12
   │
52 │ pub struct port Buses {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
52 │ pub struct port Buses {
   │            ----

warning: The port keyword no longer has any effect on structs.
  ┌─ ../src/regfile.spade:5:12
  │
5 │ pub struct port RegfilePort {
  │            ^^^^ struct port and struct are now the same thing
  │
  = Consider removing `port`
  │
5 │ pub struct port RegfilePort {
  │            ----

warning: The port keyword no longer has any effect on structs.
  ┌─ build/libs/ready_valid/src/main.spade:7:12
  │
7 │ pub struct port Rv<T> {
  │            ^^^^ struct port and struct are now the same thing
  │
  = Consider removing `port`
  │
7 │ pub struct port Rv<T> {
  │            ----

warning: The port keyword no longer has any effect on structs.
    ┌─ build/libs/ready_valid/src/main.spade:148:8
    │
148 │ struct port FifoOut<T> {
    │        ^^^^ struct port and struct are now the same thing
    │
    = Consider removing `port`
    │
148 │ struct port FifoOut<T> {
    │        ----

error: Unexpected `:`, expected `Identifier`
    ┌─ build/libs/ready_valid/src/main.spade:155:33
    │
155 │     pub fn read_empty(self, wire: inv &bool) -> FifoOut<T> {
    │                                 ^ expected `Identifier`

error: Unexpected `:`, expected `Identifier`
    ┌─ build/libs/ready_valid/src/main.spade:161:32
    │
161 │     pub fn read_full(self, wire: inv &bool) -> FifoOut<T> {
    │                                ^ expected `Identifier`

warning: Deprecated type-level function `uint_bits_to_fit`
  ┌─ build/libs/ready_valid/src/option_ext.spade:9:11
  │
9 │ where O: {uint_bits_to_fit(V) - 1},
  │           ^^^^^^^^^^^^^^^^
  │
  = Use `uint::bits_for` instead
  │
9 │ where O: {uint::bits_for(V) - 1},
  │           ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/ready_valid/src/option_ext.spade:10:11
   │
10 │       O: {uint_bits_to_fit(V - 1)}
   │           ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
10 │       O: {uint::bits_for(V - 1)}
   │           ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
  ┌─ build/libs/nstd/src/mem.spade:9:15
  │
9 │     where W: {uint_bits_to_fit(C)}
  │               ^^^^^^^^^^^^^^^^
  │
  = Use `uint::bits_for` instead
  │
9 │     where W: {uint::bits_for(C)}
  │               ~~~~~~~~~~~~~~

warning: Deprecated tuple syntax indexing
   ┌─ src/led_blink.spade:49:27
   │
49 │             range: (trunc(UPPER_DMEM#0), trunc(UPPER_DMEM#1)),
   │                           ^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ src/led_blink.spade:49:48
   │
49 │             range: (trunc(UPPER_DMEM#0), trunc(UPPER_DMEM#1)),
   │                                                ^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ src/led_blink.spade:57:32
   │
57 │             if zext(address) < LOWER_DATA_MEM_RANGE#1 { lower_data_mem_out }
   │                                ^^^^^^^^^^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ src/led_blink.spade:58:37
   │
58 │             else if zext(address) < LED_RANGE#1 { 0 }
   │                                     ^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ src/led_blink.spade:59:37
   │
59 │             else if zext(address) < TIMER_RANGE#1 { stage(-1).timer_out }
   │                                     ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ ../src/memory.spade:28:54
   │
28 │         Command::Write(write_data) => (zext(addr) >= range#0 && zext(addr) < range#1, write_data),
   │                                                      ^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ ../src/memory.spade:28:78
   │
28 │         Command::Write(write_data) => (zext(addr) >= range#0 && zext(addr) < range#1, write_data),
   │                                                                              ^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ ../src/memory.spade:31:27
   │
31 │     let addr = addr-trunc(range#0);
   │                           ^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:106:17
    │
106 │         assert (range#1 - range#0) == 16384;
    │                 ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:106:27
    │
106 │         assert (range#1 - range#0) == 16384;
    │                           ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:109:41
    │
109 │             split_control_write_signals(buses#0, range), 
    │                                         ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:110:41
    │
110 │             split_control_write_signals(buses#1, range)
    │                                         ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:112:85
    │
112 │         let MemorySignals$(write_ports: wp0, addr_first_bits: _, access_width: _) = mem_signals#0;
    │                                                                                     ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:113:85
    │
113 │         let MemorySignals$(write_ports: wp1, addr_first_bits: _, access_width: _) = mem_signals#1;
    │                                                                                     ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:116:22
    │
116 │         assert match buses#1.cmd {Command::Read => true, Command::Nop => true, _ => false};
    │                      ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:125:46
    │
125 │         let data1_0 = inst read_memory(mem0, wp0[0]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:126:46
    │
126 │         let data1_1 = inst read_memory(mem1, wp0[1]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:127:46
    │
127 │         let data1_2 = inst read_memory(mem2, wp0[2]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:128:46
    │
128 │         let data1_3 = inst read_memory(mem3, wp0[3]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:130:46
    │
130 │         let data2_0 = inst read_memory(mem0, wp1[0]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:131:46
    │
131 │         let data2_1 = inst read_memory(mem1, wp1[1]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:132:46
    │
132 │         let data2_2 = inst read_memory(mem2, wp1[2]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:133:46
    │
133 │         let data2_3 = inst read_memory(mem3, wp1[3]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:137:26
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                          ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:137:35
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                                   ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:137:67
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                                                                   ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:137:76
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                                                                            ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/bus.spade:166:12
    │
166 │     assert region#1 > region#0;
    │            ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/bus.spade:166:23
    │
166 │     assert region#1 > region#0;
    │                       ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/ready_valid/src/option_ext.spade:25:42
   │
25 │         let (write, read) = inst fifo::<{uint_bits_to_fit(Depth - 1)}, T, Depth>$(
   │                                          ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
25 │         let (write, read) = inst fifo::<{uint::bits_for(Depth - 1)}, T, Depth>$(
   │                                          ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
    ┌─ build/libs/ready_valid/src/main.spade:131:33
    │
131 │         reg(clk) timeout: uint<{uint_bits_to_fit(N)}> reset(rst: 0) =
    │                                 ^^^^^^^^^^^^^^^^
    │
    = Use `uint::bits_for` instead
    │
131 │         reg(clk) timeout: uint<{uint::bits_for(N)}> reset(rst: 0) =
    │                                 ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
    ┌─ build/libs/ready_valid/src/main.spade:241:50
    │
241 │       reg(clk) (array, num_left): ([T; N], uint<{uint_bits_to_fit(N)}>) reset(rst: (std::undef::undef(), 0)) =
    │                                                  ^^^^^^^^^^^^^^^^
    │
    = Use `uint::bits_for` instead
    │
241 │       reg(clk) (array, num_left): ([T; N], uint<{uint::bits_for(N)}>) reset(rst: (std::undef::undef(), 0)) =
    │                                                  ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/nstd/src/array.spade:70:19
   │
70 │     where NSize: {uint_bits_to_fit(N-1)}
   │                   ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
70 │     where NSize: {uint::bits_for(N-1)}
   │                   ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/nstd/src/array.spade:70:19
   │
70 │     where NSize: {uint_bits_to_fit(N-1)}
   │                   ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
70 │     where NSize: {uint::bits_for(N-1)}
   │                   ~~~~~~~~~~~~~~

error: Trait bound not satisfied. inv bool does not implement core::Data
   ┌─ src/led_blink.spade:26:5
   │    
26 │         led: inv &bool,
   │         ^^^
   │         │
   │         inv bool does not implement core::Data
   │         The type of this argument is not Data which means it cannot be stored in a register.
27 │     ) -> Buses {
   │ ╭──────────────'
   │ │ ╭────────────'
28 │ │ │         // Build the bus signals
29 │ │ │         let data_control = inst new_mut_wire();
30 │ │ │         let insn_control = inst new_mut_wire();
   · │ │
66 │ │ │         )
67 │ │ │ }
   │ ╰─│─' Required because of the trait bound specified here
   │   ╰─' The value needs to be in a register because it is in this pipeline
   │    
   = help: An value not being Data typically means it contains at least one `inv` type
   = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
   = Consider making the argument a wire
   │
26 │     wire led: inv &bool,
   │     +++++

error: Trait bound not satisfied. spadev::bus::Buses does not implement core::Data
    ┌─ ../src/cpu.spade:46:5
    │    
 46 │         buses: Buses,
    │         ^^^^^
    │         │
    │         spadev::bus::Buses does not implement core::Data
    │         The type of this argument is not Data which means it cannot be stored in a register.
    ·    
 52 │ ╭ ╭ {
 53 │ │ │         'pc
 54 │ │ │ 
 55 │ │ │         let NOP = 0x00000013;
    · │ │
244 │ │ │         )
245 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An value not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the argument a wire
    │
 46 │     wire buses: Buses,
    │     +++++

error: Trait bound not satisfied. spadev::bus::Bus does not implement core::Data
    ┌─ ../src/cpu.spade:278:5
    │    
278 │         bus: Bus,
    │         ^^^
    │         │
    │         spadev::bus::Bus does not implement core::Data
    │         The type of this argument is not Data which means it cannot be stored in a register.
    ·    
282 │     ) -> uint<32> {
    │ ╭─────────────────'
    │ │ ╭───────────────'
283 │ │ │         let write_data = rs2;
284 │ │ │ 
285 │ │ │         let (access_width, memory_command) = match op {
    · │ │
305 │ │ │         *bus.result
306 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An value not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the argument a wire
    │
278 │     wire bus: Bus,
    │     +++++

error: Trait bound not satisfied. spadev::bus::Bus does not implement core::Data
    ┌─ ../src/cpu.spade:308:38
    │    
308 │     pipeline(1) set_insn_bus(clk: clock, bus: Bus, pc_option: Option<uint<32>>) -> uint<32> {
    │                                          ^^^
    │                                          │
    │                                          spadev::bus::Bus does not implement core::Data
    │                                          The type of this argument is not Data which means it cannot be stored in a register.
    │ ╭───────────────────────────────────────────────────────────────────────────────────────────'
    │ │ ╭─────────────────────────────────────────────────────────────────────────────────────────'
309 │ │ │         set bus.control = &ControlSignals$(
310 │ │ │             access_width: AccessWidth::Full(),
311 │ │ │             addr: match pc_option {
    · │ │
321 │ │ │         *bus.result
322 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An value not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the argument a wire
    │
308 │ pipeline(1) set_insn_bus(clk: clock, wire bus: Bus, pc_option: Option<uint<32>>) -> uint<32> {
    │                                      +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ ../src/memory.spade:120:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
120 │ │ │         let mem0: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[0]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
120 │         let wire mem0: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[0]]);
    │             +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ ../src/memory.spade:121:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
121 │ │ │         let mem1: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[1]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
121 │         let wire mem1: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[1]]);
    │             +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ ../src/memory.spade:122:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
122 │ │ │         let mem2: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[2]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
122 │         let wire mem2: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[2]]);
    │             +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ ../src/memory.spade:123:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
123 │ │ │         let mem3: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[3]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
123 │         let wire mem3: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[3]]);
    │             +++++

error: Trait bound not satisfied. inv spadev::bus::ControlSignals does not implement core::Data
    ┌─ ../src/bus.spade:69:13
    │    
 68 │     pub(lib) pipeline(1) test_bus(clk: clock, load_signals: ProgramLoadSignals) -> Buses {
    │ ╭────────────────────────────────────────────────────────────────────────────────────────'
    │ │ ╭──────────────────────────────────────────────────────────────────────────────────────'
 69 │ │ │         let data_control = inst new_mut_wire();
    │ │ │             ^^^^^^^^^^^^
    │ │ │             │
    │ │ │             inv spadev::bus::ControlSignals does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
 70 │ │ │         let insn_control = inst new_mut_wire();
 71 │ │ │ 
    · │ │
110 │ │ │         )
111 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
 69 │         let wire data_control = inst new_mut_wire();
    │             +++++

error: Trait bound not satisfied. inv spadev::bus::ControlSignals does not implement core::Data
    ┌─ ../src/bus.spade:70:13
    │    
 68 │     pub(lib) pipeline(1) test_bus(clk: clock, load_signals: ProgramLoadSignals) -> Buses {
    │ ╭────────────────────────────────────────────────────────────────────────────────────────'
    │ │ ╭──────────────────────────────────────────────────────────────────────────────────────'
 69 │ │ │         let data_control = inst new_mut_wire();
 70 │ │ │         let insn_control = inst new_mut_wire();
    │ │ │             ^^^^^^^^^^^^
    │ │ │             │
    │ │ │             inv spadev::bus::ControlSignals does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
 71 │ │ │ 
    · │ │
110 │ │ │         )
111 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
 70 │         let wire insn_control = inst new_mut_wire();
    │             +++++

error: Trait bound not satisfied. spadev::regfile::RegfilePort does not implement core::Data
   ┌─ ../src/regfile.spade:14:5
   │    
14 │         regfile: RegfilePort,
   │         ^^^^^^^
   │         │
   │         spadev::regfile::RegfilePort does not implement core::Data
   │         The type of this argument is not Data which means it cannot be stored in a register.
   ·    
18 │     ) -> (int<32>, int<32>) {
   │ ╭───────────────────────────'
   │ │ ╭─────────────────────────'
19 │ │ │         set regfile.write = &write;
20 │ │ │         set regfile.idxa = &idxa;
21 │ │ │         set regfile.idxb = &idxb;
22 │ │ │     reg;
23 │ │ │         *regfile.read
24 │ │ │ }
   │ ╰─│─' Required because of the trait bound specified here
   │   ╰─' The value needs to be in a register because it is in this pipeline
   │    
   = help: An value not being Data typically means it contains at least one `inv` type
   = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
   = Consider making the argument a wire
   │
14 │     wire regfile: RegfilePort,
   │     +++++

error: Trait bound not satisfied. Memory<int<32>, _> does not implement core::Data
   ┌─ ../src/regfile.spade:38:13
   │    
31 │     ) -> (int<32>, int<32>) {
   │ ╭───────────────────────────'
   │ │ ╭─────────────────────────'
32 │ │ │         let (we, dreg, dval) = match write {
33 │ │ │             Option::Some((dreg, dval)) => (true, dreg, dval),
34 │ │ │             // NOTE: We really need to add a way to specify don't care here
   · │ │
38 │ │ │         let regs: Memory<int<32>, N> = inst clocked_memory(clk, [(we, trunc(dreg), dval)]);
   │ │ │             ^^^^
   │ │ │             │
   │ │ │             Memory<int<32>, _> does not implement core::Data
   │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
   · │ │
48 │ │ │         )
49 │ │ │ }
   │ ╰─│─' Required because of the trait bound specified here
   │   ╰─' The value needs to be in a register because it is in this pipeline
   │    
   = help: An expression not being Data typically means it contains at least one `inv` type
   = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
   = Consider making the binding a wire
   │
38 │         let wire regs: Memory<int<32>, N> = inst clocked_memory(clk, [(we, trunc(dreg), dval)]);
   │             +++++

Error: aborting due to previous error

Location:
    spade-compiler/src/main.rs:174:23
Error: 
   0: Failed to build spade code

Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.
Run with RUST_BACKTRACE=full to include source snippets.

        
pnr (fail)
          [WARN] swim.toml contains 1 unknown field:
[WARN]   synthesis.?.extra_verilog
[INFO] Building spade code
[ERROR] Failed to build spade code
HEAD is now at 3170518 Fix tests
HEAD is now at d029c73 Bump Spade again
HEAD is now at 92b6b79 Add pub markers
warning: The port keyword no longer has any effect on structs.
  ┌─ build/libs/ready_valid/src/main.spade:7:12
  │
7 │ pub struct port Rv<T> {
  │            ^^^^ struct port and struct are now the same thing
  │
  = Consider removing `port`
  │
7 │ pub struct port Rv<T> {
  │            ----

warning: The port keyword no longer has any effect on structs.
    ┌─ build/libs/ready_valid/src/main.spade:148:8
    │
148 │ struct port FifoOut<T> {
    │        ^^^^ struct port and struct are now the same thing
    │
    = Consider removing `port`
    │
148 │ struct port FifoOut<T> {
    │        ----

error: Unexpected `:`, expected `Identifier`
    ┌─ build/libs/ready_valid/src/main.spade:155:33
    │
155 │     pub fn read_empty(self, wire: inv &bool) -> FifoOut<T> {
    │                                 ^ expected `Identifier`

error: Unexpected `:`, expected `Identifier`
    ┌─ build/libs/ready_valid/src/main.spade:161:32
    │
161 │     pub fn read_full(self, wire: inv &bool) -> FifoOut<T> {
    │                                ^ expected `Identifier`

warning: The port keyword no longer has any effect on structs.
   ┌─ ../src/csr.spade:10:12
   │
10 │ pub struct port CsrInterface {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
10 │ pub struct port CsrInterface {
   │            ----

warning: The port keyword no longer has any effect on structs.
   ┌─ ../src/bus.spade:45:12
   │
45 │ pub struct port Bus {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
45 │ pub struct port Bus {
   │            ----

warning: The port keyword no longer has any effect on structs.
   ┌─ ../src/bus.spade:52:12
   │
52 │ pub struct port Buses {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
52 │ pub struct port Buses {
   │            ----

warning: The port keyword no longer has any effect on structs.
  ┌─ ../src/regfile.spade:5:12
  │
5 │ pub struct port RegfilePort {
  │            ^^^^ struct port and struct are now the same thing
  │
  = Consider removing `port`
  │
5 │ pub struct port RegfilePort {
  │            ----

warning: Deprecated type-level function `uint_bits_to_fit`
  ┌─ build/libs/nstd/src/mem.spade:9:15
  │
9 │     where W: {uint_bits_to_fit(C)}
  │               ^^^^^^^^^^^^^^^^
  │
  = Use `uint::bits_for` instead
  │
9 │     where W: {uint::bits_for(C)}
  │               ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
  ┌─ build/libs/ready_valid/src/option_ext.spade:9:11
  │
9 │ where O: {uint_bits_to_fit(V) - 1},
  │           ^^^^^^^^^^^^^^^^
  │
  = Use `uint::bits_for` instead
  │
9 │ where O: {uint::bits_for(V) - 1},
  │           ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/ready_valid/src/option_ext.spade:10:11
   │
10 │       O: {uint_bits_to_fit(V - 1)}
   │           ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
10 │       O: {uint::bits_for(V - 1)}
   │           ~~~~~~~~~~~~~~

warning: Deprecated tuple syntax indexing
   ┌─ src/led_blink.spade:49:27
   │
49 │             range: (trunc(UPPER_DMEM#0), trunc(UPPER_DMEM#1)),
   │                           ^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ src/led_blink.spade:49:48
   │
49 │             range: (trunc(UPPER_DMEM#0), trunc(UPPER_DMEM#1)),
   │                                                ^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ src/led_blink.spade:57:32
   │
57 │             if zext(address) < LOWER_DATA_MEM_RANGE#1 { lower_data_mem_out }
   │                                ^^^^^^^^^^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ src/led_blink.spade:58:37
   │
58 │             else if zext(address) < LED_RANGE#1 { 0 }
   │                                     ^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ src/led_blink.spade:59:37
   │
59 │             else if zext(address) < TIMER_RANGE#1 { stage(-1).timer_out }
   │                                     ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/nstd/src/array.spade:70:19
   │
70 │     where NSize: {uint_bits_to_fit(N-1)}
   │                   ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
70 │     where NSize: {uint::bits_for(N-1)}
   │                   ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/nstd/src/array.spade:70:19
   │
70 │     where NSize: {uint_bits_to_fit(N-1)}
   │                   ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
70 │     where NSize: {uint::bits_for(N-1)}
   │                   ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/ready_valid/src/option_ext.spade:25:42
   │
25 │         let (write, read) = inst fifo::<{uint_bits_to_fit(Depth - 1)}, T, Depth>$(
   │                                          ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
25 │         let (write, read) = inst fifo::<{uint::bits_for(Depth - 1)}, T, Depth>$(
   │                                          ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
    ┌─ build/libs/ready_valid/src/main.spade:131:33
    │
131 │         reg(clk) timeout: uint<{uint_bits_to_fit(N)}> reset(rst: 0) =
    │                                 ^^^^^^^^^^^^^^^^
    │
    = Use `uint::bits_for` instead
    │
131 │         reg(clk) timeout: uint<{uint::bits_for(N)}> reset(rst: 0) =
    │                                 ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
    ┌─ build/libs/ready_valid/src/main.spade:241:50
    │
241 │       reg(clk) (array, num_left): ([T; N], uint<{uint_bits_to_fit(N)}>) reset(rst: (std::undef::undef(), 0)) =
    │                                                  ^^^^^^^^^^^^^^^^
    │
    = Use `uint::bits_for` instead
    │
241 │       reg(clk) (array, num_left): ([T; N], uint<{uint::bits_for(N)}>) reset(rst: (std::undef::undef(), 0)) =
    │                                                  ~~~~~~~~~~~~~~

warning: Deprecated tuple syntax indexing
   ┌─ ../src/memory.spade:28:54
   │
28 │         Command::Write(write_data) => (zext(addr) >= range#0 && zext(addr) < range#1, write_data),
   │                                                      ^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ ../src/memory.spade:28:78
   │
28 │         Command::Write(write_data) => (zext(addr) >= range#0 && zext(addr) < range#1, write_data),
   │                                                                              ^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ ../src/memory.spade:31:27
   │
31 │     let addr = addr-trunc(range#0);
   │                           ^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:106:17
    │
106 │         assert (range#1 - range#0) == 16384;
    │                 ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:106:27
    │
106 │         assert (range#1 - range#0) == 16384;
    │                           ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:109:41
    │
109 │             split_control_write_signals(buses#0, range), 
    │                                         ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:110:41
    │
110 │             split_control_write_signals(buses#1, range)
    │                                         ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:112:85
    │
112 │         let MemorySignals$(write_ports: wp0, addr_first_bits: _, access_width: _) = mem_signals#0;
    │                                                                                     ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:113:85
    │
113 │         let MemorySignals$(write_ports: wp1, addr_first_bits: _, access_width: _) = mem_signals#1;
    │                                                                                     ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:116:22
    │
116 │         assert match buses#1.cmd {Command::Read => true, Command::Nop => true, _ => false};
    │                      ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:125:46
    │
125 │         let data1_0 = inst read_memory(mem0, wp0[0]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:126:46
    │
126 │         let data1_1 = inst read_memory(mem1, wp0[1]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:127:46
    │
127 │         let data1_2 = inst read_memory(mem2, wp0[2]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:128:46
    │
128 │         let data1_3 = inst read_memory(mem3, wp0[3]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:130:46
    │
130 │         let data2_0 = inst read_memory(mem0, wp1[0]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:131:46
    │
131 │         let data2_1 = inst read_memory(mem1, wp1[1]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:132:46
    │
132 │         let data2_2 = inst read_memory(mem2, wp1[2]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:133:46
    │
133 │         let data2_3 = inst read_memory(mem3, wp1[3]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:137:26
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                          ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:137:35
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                                   ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:137:67
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                                                                   ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:137:76
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                                                                            ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/bus.spade:166:12
    │
166 │     assert region#1 > region#0;
    │            ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/bus.spade:166:23
    │
166 │     assert region#1 > region#0;
    │                       ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

error: Trait bound not satisfied. inv bool does not implement core::Data
   ┌─ src/led_blink.spade:26:5
   │    
26 │         led: inv &bool,
   │         ^^^
   │         │
   │         inv bool does not implement core::Data
   │         The type of this argument is not Data which means it cannot be stored in a register.
27 │     ) -> Buses {
   │ ╭──────────────'
   │ │ ╭────────────'
28 │ │ │         // Build the bus signals
29 │ │ │         let data_control = inst new_mut_wire();
30 │ │ │         let insn_control = inst new_mut_wire();
   · │ │
66 │ │ │         )
67 │ │ │ }
   │ ╰─│─' Required because of the trait bound specified here
   │   ╰─' The value needs to be in a register because it is in this pipeline
   │    
   = help: An value not being Data typically means it contains at least one `inv` type
   = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
   = Consider making the argument a wire
   │
26 │     wire led: inv &bool,
   │     +++++

error: Trait bound not satisfied. spadev::bus::Buses does not implement core::Data
    ┌─ ../src/cpu.spade:46:5
    │    
 46 │         buses: Buses,
    │         ^^^^^
    │         │
    │         spadev::bus::Buses does not implement core::Data
    │         The type of this argument is not Data which means it cannot be stored in a register.
    ·    
 52 │ ╭ ╭ {
 53 │ │ │         'pc
 54 │ │ │ 
 55 │ │ │         let NOP = 0x00000013;
    · │ │
244 │ │ │         )
245 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An value not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the argument a wire
    │
 46 │     wire buses: Buses,
    │     +++++

error: Trait bound not satisfied. spadev::bus::Bus does not implement core::Data
    ┌─ ../src/cpu.spade:278:5
    │    
278 │         bus: Bus,
    │         ^^^
    │         │
    │         spadev::bus::Bus does not implement core::Data
    │         The type of this argument is not Data which means it cannot be stored in a register.
    ·    
282 │     ) -> uint<32> {
    │ ╭─────────────────'
    │ │ ╭───────────────'
283 │ │ │         let write_data = rs2;
284 │ │ │ 
285 │ │ │         let (access_width, memory_command) = match op {
    · │ │
305 │ │ │         *bus.result
306 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An value not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the argument a wire
    │
278 │     wire bus: Bus,
    │     +++++

error: Trait bound not satisfied. spadev::bus::Bus does not implement core::Data
    ┌─ ../src/cpu.spade:308:38
    │    
308 │     pipeline(1) set_insn_bus(clk: clock, bus: Bus, pc_option: Option<uint<32>>) -> uint<32> {
    │                                          ^^^
    │                                          │
    │                                          spadev::bus::Bus does not implement core::Data
    │                                          The type of this argument is not Data which means it cannot be stored in a register.
    │ ╭───────────────────────────────────────────────────────────────────────────────────────────'
    │ │ ╭─────────────────────────────────────────────────────────────────────────────────────────'
309 │ │ │         set bus.control = &ControlSignals$(
310 │ │ │             access_width: AccessWidth::Full(),
311 │ │ │             addr: match pc_option {
    · │ │
321 │ │ │         *bus.result
322 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An value not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the argument a wire
    │
308 │ pipeline(1) set_insn_bus(clk: clock, wire bus: Bus, pc_option: Option<uint<32>>) -> uint<32> {
    │                                      +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ ../src/memory.spade:120:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
120 │ │ │         let mem0: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[0]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
120 │         let wire mem0: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[0]]);
    │             +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ ../src/memory.spade:121:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
121 │ │ │         let mem1: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[1]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
121 │         let wire mem1: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[1]]);
    │             +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ ../src/memory.spade:122:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
122 │ │ │         let mem2: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[2]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
122 │         let wire mem2: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[2]]);
    │             +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ ../src/memory.spade:123:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
123 │ │ │         let mem3: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[3]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
123 │         let wire mem3: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[3]]);
    │             +++++

error: Trait bound not satisfied. inv spadev::bus::ControlSignals does not implement core::Data
    ┌─ ../src/bus.spade:69:13
    │    
 68 │     pub(lib) pipeline(1) test_bus(clk: clock, load_signals: ProgramLoadSignals) -> Buses {
    │ ╭────────────────────────────────────────────────────────────────────────────────────────'
    │ │ ╭──────────────────────────────────────────────────────────────────────────────────────'
 69 │ │ │         let data_control = inst new_mut_wire();
    │ │ │             ^^^^^^^^^^^^
    │ │ │             │
    │ │ │             inv spadev::bus::ControlSignals does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
 70 │ │ │         let insn_control = inst new_mut_wire();
 71 │ │ │ 
    · │ │
110 │ │ │         )
111 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
 69 │         let wire data_control = inst new_mut_wire();
    │             +++++

error: Trait bound not satisfied. inv spadev::bus::ControlSignals does not implement core::Data
    ┌─ ../src/bus.spade:70:13
    │    
 68 │     pub(lib) pipeline(1) test_bus(clk: clock, load_signals: ProgramLoadSignals) -> Buses {
    │ ╭────────────────────────────────────────────────────────────────────────────────────────'
    │ │ ╭──────────────────────────────────────────────────────────────────────────────────────'
 69 │ │ │         let data_control = inst new_mut_wire();
 70 │ │ │         let insn_control = inst new_mut_wire();
    │ │ │             ^^^^^^^^^^^^
    │ │ │             │
    │ │ │             inv spadev::bus::ControlSignals does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
 71 │ │ │ 
    · │ │
110 │ │ │         )
111 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
 70 │         let wire insn_control = inst new_mut_wire();
    │             +++++

error: Trait bound not satisfied. spadev::regfile::RegfilePort does not implement core::Data
   ┌─ ../src/regfile.spade:14:5
   │    
14 │         regfile: RegfilePort,
   │         ^^^^^^^
   │         │
   │         spadev::regfile::RegfilePort does not implement core::Data
   │         The type of this argument is not Data which means it cannot be stored in a register.
   ·    
18 │     ) -> (int<32>, int<32>) {
   │ ╭───────────────────────────'
   │ │ ╭─────────────────────────'
19 │ │ │         set regfile.write = &write;
20 │ │ │         set regfile.idxa = &idxa;
21 │ │ │         set regfile.idxb = &idxb;
22 │ │ │     reg;
23 │ │ │         *regfile.read
24 │ │ │ }
   │ ╰─│─' Required because of the trait bound specified here
   │   ╰─' The value needs to be in a register because it is in this pipeline
   │    
   = help: An value not being Data typically means it contains at least one `inv` type
   = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
   = Consider making the argument a wire
   │
14 │     wire regfile: RegfilePort,
   │     +++++

error: Trait bound not satisfied. Memory<int<32>, _> does not implement core::Data
   ┌─ ../src/regfile.spade:38:13
   │    
31 │     ) -> (int<32>, int<32>) {
   │ ╭───────────────────────────'
   │ │ ╭─────────────────────────'
32 │ │ │         let (we, dreg, dval) = match write {
33 │ │ │             Option::Some((dreg, dval)) => (true, dreg, dval),
34 │ │ │             // NOTE: We really need to add a way to specify don't care here
   · │ │
38 │ │ │         let regs: Memory<int<32>, N> = inst clocked_memory(clk, [(we, trunc(dreg), dval)]);
   │ │ │             ^^^^
   │ │ │             │
   │ │ │             Memory<int<32>, _> does not implement core::Data
   │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
   · │ │
48 │ │ │         )
49 │ │ │ }
   │ ╰─│─' Required because of the trait bound specified here
   │   ╰─' The value needs to be in a register because it is in this pipeline
   │    
   = help: An expression not being Data typically means it contains at least one `inv` type
   = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
   = Consider making the binding a wire
   │
38 │         let wire regs: Memory<int<32>, N> = inst clocked_memory(clk, [(we, trunc(dreg), dval)]);
   │             +++++

Error: aborting due to previous error

Location:
    spade-compiler/src/main.rs:174:23
Error: 
   0: Failed to build spade code

Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.
Run with RUST_BACKTRACE=full to include source snippets.

        
test (fail)
          [WARN] swim.toml contains 1 unknown field:
[WARN]   synthesis.?.extra_verilog
[INFO] Building spade code
[ERROR] Failed to build spade code
HEAD is now at 3170518 Fix tests
HEAD is now at d029c73 Bump Spade again
HEAD is now at 92b6b79 Add pub markers
warning: The port keyword no longer has any effect on structs.
   ┌─ ../src/csr.spade:10:12
   │
10 │ pub struct port CsrInterface {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
10 │ pub struct port CsrInterface {
   │            ----

warning: The port keyword no longer has any effect on structs.
   ┌─ ../src/bus.spade:45:12
   │
45 │ pub struct port Bus {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
45 │ pub struct port Bus {
   │            ----

warning: The port keyword no longer has any effect on structs.
   ┌─ ../src/bus.spade:52:12
   │
52 │ pub struct port Buses {
   │            ^^^^ struct port and struct are now the same thing
   │
   = Consider removing `port`
   │
52 │ pub struct port Buses {
   │            ----

warning: The port keyword no longer has any effect on structs.
  ┌─ ../src/regfile.spade:5:12
  │
5 │ pub struct port RegfilePort {
  │            ^^^^ struct port and struct are now the same thing
  │
  = Consider removing `port`
  │
5 │ pub struct port RegfilePort {
  │            ----

warning: The port keyword no longer has any effect on structs.
  ┌─ build/libs/ready_valid/src/main.spade:7:12
  │
7 │ pub struct port Rv<T> {
  │            ^^^^ struct port and struct are now the same thing
  │
  = Consider removing `port`
  │
7 │ pub struct port Rv<T> {
  │            ----

warning: The port keyword no longer has any effect on structs.
    ┌─ build/libs/ready_valid/src/main.spade:148:8
    │
148 │ struct port FifoOut<T> {
    │        ^^^^ struct port and struct are now the same thing
    │
    = Consider removing `port`
    │
148 │ struct port FifoOut<T> {
    │        ----

error: Unexpected `:`, expected `Identifier`
    ┌─ build/libs/ready_valid/src/main.spade:155:33
    │
155 │     pub fn read_empty(self, wire: inv &bool) -> FifoOut<T> {
    │                                 ^ expected `Identifier`

error: Unexpected `:`, expected `Identifier`
    ┌─ build/libs/ready_valid/src/main.spade:161:32
    │
161 │     pub fn read_full(self, wire: inv &bool) -> FifoOut<T> {
    │                                ^ expected `Identifier`

warning: Deprecated type-level function `uint_bits_to_fit`
  ┌─ build/libs/ready_valid/src/option_ext.spade:9:11
  │
9 │ where O: {uint_bits_to_fit(V) - 1},
  │           ^^^^^^^^^^^^^^^^
  │
  = Use `uint::bits_for` instead
  │
9 │ where O: {uint::bits_for(V) - 1},
  │           ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/ready_valid/src/option_ext.spade:10:11
   │
10 │       O: {uint_bits_to_fit(V - 1)}
   │           ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
10 │       O: {uint::bits_for(V - 1)}
   │           ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
  ┌─ build/libs/nstd/src/mem.spade:9:15
  │
9 │     where W: {uint_bits_to_fit(C)}
  │               ^^^^^^^^^^^^^^^^
  │
  = Use `uint::bits_for` instead
  │
9 │     where W: {uint::bits_for(C)}
  │               ~~~~~~~~~~~~~~

warning: Deprecated tuple syntax indexing
   ┌─ src/led_blink.spade:49:27
   │
49 │             range: (trunc(UPPER_DMEM#0), trunc(UPPER_DMEM#1)),
   │                           ^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ src/led_blink.spade:49:48
   │
49 │             range: (trunc(UPPER_DMEM#0), trunc(UPPER_DMEM#1)),
   │                                                ^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ src/led_blink.spade:57:32
   │
57 │             if zext(address) < LOWER_DATA_MEM_RANGE#1 { lower_data_mem_out }
   │                                ^^^^^^^^^^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ src/led_blink.spade:58:37
   │
58 │             else if zext(address) < LED_RANGE#1 { 0 }
   │                                     ^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ src/led_blink.spade:59:37
   │
59 │             else if zext(address) < TIMER_RANGE#1 { stage(-1).timer_out }
   │                                     ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ ../src/memory.spade:28:54
   │
28 │         Command::Write(write_data) => (zext(addr) >= range#0 && zext(addr) < range#1, write_data),
   │                                                      ^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ ../src/memory.spade:28:78
   │
28 │         Command::Write(write_data) => (zext(addr) >= range#0 && zext(addr) < range#1, write_data),
   │                                                                              ^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
   ┌─ ../src/memory.spade:31:27
   │
31 │     let addr = addr-trunc(range#0);
   │                           ^^^^^^^ `#` syntax for tuple indexing is deprecated
   │
   = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:106:17
    │
106 │         assert (range#1 - range#0) == 16384;
    │                 ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:106:27
    │
106 │         assert (range#1 - range#0) == 16384;
    │                           ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:109:41
    │
109 │             split_control_write_signals(buses#0, range), 
    │                                         ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:110:41
    │
110 │             split_control_write_signals(buses#1, range)
    │                                         ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:112:85
    │
112 │         let MemorySignals$(write_ports: wp0, addr_first_bits: _, access_width: _) = mem_signals#0;
    │                                                                                     ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:113:85
    │
113 │         let MemorySignals$(write_ports: wp1, addr_first_bits: _, access_width: _) = mem_signals#1;
    │                                                                                     ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:116:22
    │
116 │         assert match buses#1.cmd {Command::Read => true, Command::Nop => true, _ => false};
    │                      ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:125:46
    │
125 │         let data1_0 = inst read_memory(mem0, wp0[0]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:126:46
    │
126 │         let data1_1 = inst read_memory(mem1, wp0[1]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:127:46
    │
127 │         let data1_2 = inst read_memory(mem2, wp0[2]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:128:46
    │
128 │         let data1_3 = inst read_memory(mem3, wp0[3]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:130:46
    │
130 │         let data2_0 = inst read_memory(mem0, wp1[0]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:131:46
    │
131 │         let data2_1 = inst read_memory(mem1, wp1[1]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:132:46
    │
132 │         let data2_2 = inst read_memory(mem2, wp1[2]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:133:46
    │
133 │         let data2_3 = inst read_memory(mem3, wp1[3]#1);
    │                                              ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:137:26
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                          ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:137:35
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                                   ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:137:67
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                                                                   ^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/memory.spade:137:76
    │
137 │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
    │                                                                            ^^^^^^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/bus.spade:166:12
    │
166 │     assert region#1 > region#0;
    │            ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated tuple syntax indexing
    ┌─ ../src/bus.spade:166:23
    │
166 │     assert region#1 > region#0;
    │                       ^^^^^^^^ `#` syntax for tuple indexing is deprecated
    │
    = note: replace `#` with `.`

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/ready_valid/src/option_ext.spade:25:42
   │
25 │         let (write, read) = inst fifo::<{uint_bits_to_fit(Depth - 1)}, T, Depth>$(
   │                                          ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
25 │         let (write, read) = inst fifo::<{uint::bits_for(Depth - 1)}, T, Depth>$(
   │                                          ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
    ┌─ build/libs/ready_valid/src/main.spade:131:33
    │
131 │         reg(clk) timeout: uint<{uint_bits_to_fit(N)}> reset(rst: 0) =
    │                                 ^^^^^^^^^^^^^^^^
    │
    = Use `uint::bits_for` instead
    │
131 │         reg(clk) timeout: uint<{uint::bits_for(N)}> reset(rst: 0) =
    │                                 ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
    ┌─ build/libs/ready_valid/src/main.spade:241:50
    │
241 │       reg(clk) (array, num_left): ([T; N], uint<{uint_bits_to_fit(N)}>) reset(rst: (std::undef::undef(), 0)) =
    │                                                  ^^^^^^^^^^^^^^^^
    │
    = Use `uint::bits_for` instead
    │
241 │       reg(clk) (array, num_left): ([T; N], uint<{uint::bits_for(N)}>) reset(rst: (std::undef::undef(), 0)) =
    │                                                  ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/nstd/src/array.spade:70:19
   │
70 │     where NSize: {uint_bits_to_fit(N-1)}
   │                   ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
70 │     where NSize: {uint::bits_for(N-1)}
   │                   ~~~~~~~~~~~~~~

warning: Deprecated type-level function `uint_bits_to_fit`
   ┌─ build/libs/nstd/src/array.spade:70:19
   │
70 │     where NSize: {uint_bits_to_fit(N-1)}
   │                   ^^^^^^^^^^^^^^^^
   │
   = Use `uint::bits_for` instead
   │
70 │     where NSize: {uint::bits_for(N-1)}
   │                   ~~~~~~~~~~~~~~

error: Trait bound not satisfied. inv bool does not implement core::Data
   ┌─ src/led_blink.spade:26:5
   │    
26 │         led: inv &bool,
   │         ^^^
   │         │
   │         inv bool does not implement core::Data
   │         The type of this argument is not Data which means it cannot be stored in a register.
27 │     ) -> Buses {
   │ ╭──────────────'
   │ │ ╭────────────'
28 │ │ │         // Build the bus signals
29 │ │ │         let data_control = inst new_mut_wire();
30 │ │ │         let insn_control = inst new_mut_wire();
   · │ │
66 │ │ │         )
67 │ │ │ }
   │ ╰─│─' Required because of the trait bound specified here
   │   ╰─' The value needs to be in a register because it is in this pipeline
   │    
   = help: An value not being Data typically means it contains at least one `inv` type
   = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
   = Consider making the argument a wire
   │
26 │     wire led: inv &bool,
   │     +++++

error: Trait bound not satisfied. spadev::bus::Buses does not implement core::Data
    ┌─ ../src/cpu.spade:46:5
    │    
 46 │         buses: Buses,
    │         ^^^^^
    │         │
    │         spadev::bus::Buses does not implement core::Data
    │         The type of this argument is not Data which means it cannot be stored in a register.
    ·    
 52 │ ╭ ╭ {
 53 │ │ │         'pc
 54 │ │ │ 
 55 │ │ │         let NOP = 0x00000013;
    · │ │
244 │ │ │         )
245 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An value not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the argument a wire
    │
 46 │     wire buses: Buses,
    │     +++++

error: Trait bound not satisfied. spadev::bus::Bus does not implement core::Data
    ┌─ ../src/cpu.spade:278:5
    │    
278 │         bus: Bus,
    │         ^^^
    │         │
    │         spadev::bus::Bus does not implement core::Data
    │         The type of this argument is not Data which means it cannot be stored in a register.
    ·    
282 │     ) -> uint<32> {
    │ ╭─────────────────'
    │ │ ╭───────────────'
283 │ │ │         let write_data = rs2;
284 │ │ │ 
285 │ │ │         let (access_width, memory_command) = match op {
    · │ │
305 │ │ │         *bus.result
306 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An value not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the argument a wire
    │
278 │     wire bus: Bus,
    │     +++++

error: Trait bound not satisfied. spadev::bus::Bus does not implement core::Data
    ┌─ ../src/cpu.spade:308:38
    │    
308 │     pipeline(1) set_insn_bus(clk: clock, bus: Bus, pc_option: Option<uint<32>>) -> uint<32> {
    │                                          ^^^
    │                                          │
    │                                          spadev::bus::Bus does not implement core::Data
    │                                          The type of this argument is not Data which means it cannot be stored in a register.
    │ ╭───────────────────────────────────────────────────────────────────────────────────────────'
    │ │ ╭─────────────────────────────────────────────────────────────────────────────────────────'
309 │ │ │         set bus.control = &ControlSignals$(
310 │ │ │             access_width: AccessWidth::Full(),
311 │ │ │             addr: match pc_option {
    · │ │
321 │ │ │         *bus.result
322 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An value not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the argument a wire
    │
308 │ pipeline(1) set_insn_bus(clk: clock, wire bus: Bus, pc_option: Option<uint<32>>) -> uint<32> {
    │                                      +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ ../src/memory.spade:120:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
120 │ │ │         let mem0: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[0]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
120 │         let wire mem0: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[0]]);
    │             +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ ../src/memory.spade:121:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
121 │ │ │         let mem1: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[1]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
121 │         let wire mem1: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[1]]);
    │             +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ ../src/memory.spade:122:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
122 │ │ │         let mem2: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[2]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
122 │         let wire mem2: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[2]]);
    │             +++++

error: Trait bound not satisfied. Memory<uint<8>, 4096> does not implement core::Data
    ┌─ ../src/memory.spade:123:13
    │    
105 │     ) -> (uint<32>, uint<32>) {
    │ ╭─────────────────────────────'
    │ │ ╭───────────────────────────'
106 │ │ │         assert (range#1 - range#0) == 16384;
107 │ │ │ 
108 │ │ │         let mem_signals = (
    · │ │
123 │ │ │         let mem3: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[3]]);
    │ │ │             ^^^^
    │ │ │             │
    │ │ │             Memory<uint<8>, 4096> does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
    · │ │
137 │ │ │         (unswizzle_reads(bytes#0, mem_signals#0), unswizzle_reads(bytes#1, mem_signals#1))
138 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
123 │         let wire mem3: Memory<uint<8>, 4096> = inst clocked_memory(clk, [wp0[3]]);
    │             +++++

error: Trait bound not satisfied. inv spadev::bus::ControlSignals does not implement core::Data
    ┌─ ../src/bus.spade:69:13
    │    
 68 │     pub(lib) pipeline(1) test_bus(clk: clock, load_signals: ProgramLoadSignals) -> Buses {
    │ ╭────────────────────────────────────────────────────────────────────────────────────────'
    │ │ ╭──────────────────────────────────────────────────────────────────────────────────────'
 69 │ │ │         let data_control = inst new_mut_wire();
    │ │ │             ^^^^^^^^^^^^
    │ │ │             │
    │ │ │             inv spadev::bus::ControlSignals does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
 70 │ │ │         let insn_control = inst new_mut_wire();
 71 │ │ │ 
    · │ │
110 │ │ │         )
111 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
 69 │         let wire data_control = inst new_mut_wire();
    │             +++++

error: Trait bound not satisfied. inv spadev::bus::ControlSignals does not implement core::Data
    ┌─ ../src/bus.spade:70:13
    │    
 68 │     pub(lib) pipeline(1) test_bus(clk: clock, load_signals: ProgramLoadSignals) -> Buses {
    │ ╭────────────────────────────────────────────────────────────────────────────────────────'
    │ │ ╭──────────────────────────────────────────────────────────────────────────────────────'
 69 │ │ │         let data_control = inst new_mut_wire();
 70 │ │ │         let insn_control = inst new_mut_wire();
    │ │ │             ^^^^^^^^^^^^
    │ │ │             │
    │ │ │             inv spadev::bus::ControlSignals does not implement core::Data
    │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
 71 │ │ │ 
    · │ │
110 │ │ │         )
111 │ │ │ }
    │ ╰─│─' Required because of the trait bound specified here
    │   ╰─' The value needs to be in a register because it is in this pipeline
    │    
    = help: An expression not being Data typically means it contains at least one `inv` type
    = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
    = Consider making the binding a wire
    │
 70 │         let wire insn_control = inst new_mut_wire();
    │             +++++

error: Trait bound not satisfied. spadev::regfile::RegfilePort does not implement core::Data
   ┌─ ../src/regfile.spade:14:5
   │    
14 │         regfile: RegfilePort,
   │         ^^^^^^^
   │         │
   │         spadev::regfile::RegfilePort does not implement core::Data
   │         The type of this argument is not Data which means it cannot be stored in a register.
   ·    
18 │     ) -> (int<32>, int<32>) {
   │ ╭───────────────────────────'
   │ │ ╭─────────────────────────'
19 │ │ │         set regfile.write = &write;
20 │ │ │         set regfile.idxa = &idxa;
21 │ │ │         set regfile.idxb = &idxb;
22 │ │ │     reg;
23 │ │ │         *regfile.read
24 │ │ │ }
   │ ╰─│─' Required because of the trait bound specified here
   │   ╰─' The value needs to be in a register because it is in this pipeline
   │    
   = help: An value not being Data typically means it contains at least one `inv` type
   = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
   = Consider making the argument a wire
   │
14 │     wire regfile: RegfilePort,
   │     +++++

error: Trait bound not satisfied. Memory<int<32>, _> does not implement core::Data
   ┌─ ../src/regfile.spade:38:13
   │    
31 │     ) -> (int<32>, int<32>) {
   │ ╭───────────────────────────'
   │ │ ╭─────────────────────────'
32 │ │ │         let (we, dreg, dval) = match write {
33 │ │ │             Option::Some((dreg, dval)) => (true, dreg, dval),
34 │ │ │             // NOTE: We really need to add a way to specify don't care here
   · │ │
38 │ │ │         let regs: Memory<int<32>, N> = inst clocked_memory(clk, [(we, trunc(dreg), dval)]);
   │ │ │             ^^^^
   │ │ │             │
   │ │ │             Memory<int<32>, _> does not implement core::Data
   │ │ │             The type of this expression is not Data which means it cannot be stored in a register.
   · │ │
48 │ │ │         )
49 │ │ │ }
   │ ╰─│─' Required because of the trait bound specified here
   │   ╰─' The value needs to be in a register because it is in this pipeline
   │    
   = help: An expression not being Data typically means it contains at least one `inv` type
   = help: You can learn more about `Data` here: https://docs.spade-lang.org/typst/wires.html
   = Consider making the binding a wire
   │
38 │         let wire regs: Memory<int<32>, N> = inst clocked_memory(clk, [(we, trunc(dreg), dval)]);
   │             +++++

Error: aborting due to previous error

Location:
    spade-compiler/src/main.rs:174:23
Error: 
   0: Failed to build spade code

Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.
Run with RUST_BACKTRACE=full to include source snippets.

        

templates-alchitry-cu (2/2)

build (success)
          
        
pnr (success)
          
        

templates-ecpix5 (2/2)

build (success)
          
        
pnr (success)
          
        

templates-go-board (2/2)

build (success)
          
        
pnr (success)
          
        

templates-icestick (2/2)

build (success)
          
        
pnr (success)
          
        

templates-icesugar-nano (2/2)

build (success)
          
        
pnr (success)
          
        

templates-pico-ice40up5k (2/2)

build (success)
          
        
pnr (success)
          
        

templates-tangnano20k (2/2)

build (success)
          
        
pnr (success)
          
        

templates-tangnano4k (2/2)

build (success)
          
        
pnr (success)
          
        

templates-tangnano9k (2/2)

build (success)
          
        
pnr (success)
          
        

templates-tinyfpga-bx (2/2)

build (success)
          
        
pnr (success)
          
        

templates-ulx3s_85k (2/2)

build (success)
          
        
pnr (success)
          
        

vga_spade (1/1)

build (success)
          
        

ws2812 (3/3)

build (success)
          
        
pnr (success)
          
        
test (success)
          
        

ws2812-lithekod (3/3)

build (success)
          
        
pnr (success)
          
        
test (success)
          
        

This page was generated at 2026-03-21T11:31:17Z.