[ujson] Represent arrays in rust with `ArrayVec`
The default `serde` implementations for arrays max out at 32 elements.
Signed-off-by: Chris Frantz <cfrantz@google.com>
diff --git a/sw/device/lib/testing/json/pinmux_config.h b/sw/device/lib/testing/json/pinmux_config.h
index 9cb6136..c3ad106 100644
--- a/sw/device/lib/testing/json/pinmux_config.h
+++ b/sw/device/lib/testing/json/pinmux_config.h
@@ -21,19 +21,20 @@
// clang-format off
#define STRUCT_PINMUX_INPUT_SELECTION(field, string) \
- field(peripheral, pinmux_peripheral_in_t, 16) \
- field(selector, pinmux_insel_t, 16)
+ field(peripheral, pinmux_peripheral_in_t, 16) \
+ field(selector, pinmux_insel_t, 16)
UJSON_SERDE_STRUCT(PinmuxInputSelection, pinmux_input_selection_t,
STRUCT_PINMUX_INPUT_SELECTION);
#define STRUCT_PINMUX_OUTPUT_SELECTION(field, string) \
- field(mio, pinmux_mio_out_t, 16) field(selector, pinmux_outsel_t, 16)
+ field(mio, pinmux_mio_out_t, 16) \
+ field(selector, pinmux_outsel_t, 16)
UJSON_SERDE_STRUCT(PinmuxOutputSelection, pinmux_output_selection_t,
STRUCT_PINMUX_OUTPUT_SELECTION);
#define STRUCT_PINMUX_CONFIG(field, string) \
- field(input, pinmux_input_selection_t) \
- field(output, pinmux_output_selection_t)
+ field(input, pinmux_input_selection_t) \
+ field(output, pinmux_output_selection_t)
UJSON_SERDE_STRUCT(PinmuxConfig, pinmux_config_t, STRUCT_PINMUX_CONFIG);
// clang-format on
diff --git a/sw/device/lib/ujson/rust/BUILD b/sw/device/lib/ujson/rust/BUILD
index cee9711..db75770 100644
--- a/sw/device/lib/ujson/rust/BUILD
+++ b/sw/device/lib/ujson/rust/BUILD
@@ -31,6 +31,7 @@
deps = [
"//sw/host/opentitanlib",
"@crate_index//:anyhow",
+ "@crate_index//:arrayvec",
"@crate_index//:serde",
"@crate_index//:serde_json",
],
diff --git a/sw/device/lib/ujson/rust/roundtrip_test.rs b/sw/device/lib/ujson/rust/roundtrip_test.rs
index 8421ec3..7109203 100644
--- a/sw/device/lib/ujson/rust/roundtrip_test.rs
+++ b/sw/device/lib/ujson/rust/roundtrip_test.rs
@@ -74,10 +74,11 @@
fn test_matrix() -> Result<()> {
let before = example::Matrix {
k: [
- [0, 1, 2, 3, 4],
- [100, 200, 300, 400, 500],
- [-1, -2, -3, -4, -5],
- ],
+ [0, 1, 2, 3, 4].into(),
+ [100, 200, 300, 400, 500].into(),
+ [-1, -2, -3, -4, -5].into(),
+ ]
+ .into(),
};
let after = roundtrip("matrix", &serde_json::to_string(&before)?)?;
let after = serde_json::from_str::<example::Matrix>(&after)?;
diff --git a/sw/device/lib/ujson/ujson_rust.h b/sw/device/lib/ujson/ujson_rust.h
index a50edf8..bc4ac0f 100644
--- a/sw/device/lib/ujson/ujson_rust.h
+++ b/sw/device/lib/ujson/ujson_rust.h
@@ -31,7 +31,8 @@
#define int16_t i16
#define int8_t i8
-#define RUST_DEFAULT_DERIVE Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq
+#define RUST_DEFAULT_DERIVE \
+ Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq
// clang-format off
rust_attr[allow(unused_imports)]
@@ -43,9 +44,9 @@
#define ujson_struct_field_array(t_, sz_, ...) \
OT_IIF(OT_NOT(OT_VA_ARGS_COUNT(dummy, ##__VA_ARGS__))) \
( /*then*/ \
- [t_; sz_]\
+ arrayvec::ArrayVec<OT_EXPAND(t_, sz_)> \
, /*else*/ \
- [OT_OBSTRUCT(ujson_struct_field_array_indirect)()(t_, __VA_ARGS__); sz_] \
+ arrayvec::ArrayVec<OT_OBSTRUCT(ujson_struct_field_array_indirect)()(t_, __VA_ARGS__), sz_> \
) /*endif*/
#define ujson_struct_field(name_, type_, ...) \
diff --git a/sw/host/opentitanlib/BUILD b/sw/host/opentitanlib/BUILD
index 09f48ec..4620172 100644
--- a/sw/host/opentitanlib/BUILD
+++ b/sw/host/opentitanlib/BUILD
@@ -191,6 +191,7 @@
deps = [
"//sw/host/opentitanlib/bindgen",
"@crate_index//:anyhow",
+ "@crate_index//:arrayvec",
"@crate_index//:bitflags",
"@crate_index//:bitvec",
"@crate_index//:byteorder",
diff --git a/sw/host/opentitanlib/src/test_utils/pinmux_config.rs b/sw/host/opentitanlib/src/test_utils/pinmux_config.rs
index b5fbad3..55973e1 100644
--- a/sw/host/opentitanlib/src/test_utils/pinmux_config.rs
+++ b/sw/host/opentitanlib/src/test_utils/pinmux_config.rs
@@ -56,7 +56,7 @@
let mut i = 0;
while i < len {
let mut config = Self::default();
- for j in 0..config.input.peripheral.len() {
+ for _ in 0..config.input.peripheral.capacity() {
let (ik, iv) = inputs
.as_mut()
.and_then(|i| i.next())
@@ -65,10 +65,10 @@
.as_mut()
.and_then(|i| i.next())
.unwrap_or((&df_ok, &df_ov));
- config.input.peripheral[j] = *ik;
- config.input.selector[j] = *iv;
- config.output.mio[j] = *ok;
- config.output.selector[j] = *ov;
+ config.input.peripheral.push(*ik);
+ config.input.selector.push(*iv);
+ config.output.mio.push(*ok);
+ config.output.selector.push(*ov);
i += 1;
}
TestCommand::PinmuxConfig.send(uart)?;
diff --git a/sw/host/tests/rom/e2e_chip_specific_startup/BUILD b/sw/host/tests/rom/e2e_chip_specific_startup/BUILD
index 092e035..4986e11 100644
--- a/sw/host/tests/rom/e2e_chip_specific_startup/BUILD
+++ b/sw/host/tests/rom/e2e_chip_specific_startup/BUILD
@@ -25,6 +25,7 @@
deps = [
"//sw/host/opentitanlib",
"@crate_index//:anyhow",
+ "@crate_index//:arrayvec",
"@crate_index//:humantime",
"@crate_index//:log",
"@crate_index//:serde",