1use serde::{Deserialize, Serialize};
2use std::path::PathBuf;
3
4#[derive(Clone, Debug, Default, Serialize, Deserialize)]
5#[serde(deny_unknown_fields)]
6pub struct Test {
7 #[serde(default)]
8 pub simulator: SimType,
9 #[serde(default)]
10 pub dsim: DsimProperty,
11 #[serde(default)]
12 pub vcs: VcsProperty,
13 #[serde(default)]
14 pub verilator: VerilatorProperty,
15 #[serde(default)]
16 pub vivado: VivadoProperty,
17 #[serde(default)]
18 pub waveform_target: WaveFormTarget,
19 #[serde(default)]
20 pub waveform_format: WaveFormFormat,
21 #[serde(default)]
22 pub include_files: Vec<PathBuf>,
23 #[serde(default)]
24 pub defines: Vec<String>,
25 #[serde(default)]
28 pub seed: Option<u64>,
29 #[serde(default)]
30 pub four_state: bool,
31 #[serde(default)]
35 pub component_backend: Option<ComponentBackendKind>,
36}
37
38#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)]
39pub enum ComponentBackendKind {
40 #[serde(rename = "native")]
41 Native,
42 #[serde(rename = "wasm")]
43 Wasm,
44}
45
46#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq, Eq)]
47pub enum SimType {
48 #[default]
49 #[serde(rename = "verilator")]
50 Verilator,
51 #[serde(rename = "vcs")]
52 Vcs,
53 #[serde(rename = "dsim")]
54 Dsim,
55 #[serde(rename = "vivado")]
56 Vivado,
57}
58
59#[derive(Clone, Debug, Default, Serialize, Deserialize)]
60#[serde(deny_unknown_fields)]
61pub struct DsimProperty {
62 #[serde(default)]
63 pub compile_args: Vec<String>,
64 #[serde(default)]
65 pub simulate_args: Vec<String>,
66}
67
68#[derive(Clone, Debug, Default, Serialize, Deserialize)]
69#[serde(deny_unknown_fields)]
70pub struct VcsProperty {
71 #[serde(default)]
72 pub compile_args: Vec<String>,
73 #[serde(default)]
74 pub simulate_args: Vec<String>,
75}
76
77#[derive(Clone, Debug, Default, Serialize, Deserialize)]
78#[serde(deny_unknown_fields)]
79pub struct VerilatorProperty {
80 #[serde(default)]
81 pub compile_args: Vec<String>,
82 #[serde(default)]
83 pub simulate_args: Vec<String>,
84}
85
86#[derive(Clone, Debug, Default, Serialize, Deserialize)]
87#[serde(deny_unknown_fields)]
88pub struct VivadoProperty {
89 #[serde(default)]
90 pub compile_args: Vec<String>,
91 #[serde(default)]
92 pub elaborate_args: Vec<String>,
93 #[serde(default)]
94 pub simulate_args: Vec<String>,
95}
96
97#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq)]
98#[serde(tag = "type")]
99pub enum WaveFormTarget {
100 #[default]
101 #[serde(rename = "target")]
102 Target,
103 #[serde(rename = "directory")]
104 Directory { path: PathBuf },
105}
106
107#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq, Eq)]
108pub enum WaveFormFormat {
109 #[default]
110 #[serde(rename = "vcd")]
111 Vcd,
112 #[serde(rename = "fst")]
113 Fst,
114}
115
116impl WaveFormFormat {
117 pub fn extension(self) -> &'static str {
118 match self {
119 WaveFormFormat::Vcd => "vcd",
120 WaveFormFormat::Fst => "fst",
121 }
122 }
123}