Skip to main content

veryl_metadata/
synth.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Debug, Serialize, Deserialize)]
4#[serde(deny_unknown_fields)]
5pub struct Synth {
6    /// Default top module name. CLI `--top` overrides when supplied.
7    #[serde(default)]
8    pub top: Option<String>,
9    /// Number of worst-delay endpoints to report in the timing dump.
10    #[serde(default = "default_timing_paths")]
11    pub timing_paths: usize,
12    /// Clock frequency assumed for the dynamic-power estimate (MHz).
13    #[serde(default = "default_clock_freq")]
14    pub clock_freq: f64,
15    /// Per-cycle toggle rate assumed for combinational nets (0.0–1.0).
16    /// FF clock input is always assumed to toggle every cycle.
17    #[serde(default = "default_activity")]
18    pub activity: f64,
19    /// Built-in cell library / PDK to use.
20    #[serde(default)]
21    pub library: Library,
22    /// Smallest array, in stored bits, inferred as a RAM instead of flip-flops.
23    #[serde(default = "default_ram_min_bits")]
24    pub ram_min_bits: usize,
25    /// Largest number of distinct read addresses a RAM-inferred array may have.
26    #[serde(default = "default_ram_max_read_ports")]
27    pub ram_max_read_ports: usize,
28    /// Largest number of distinct write sites a RAM-inferred array may have.
29    #[serde(default = "default_ram_max_write_ports")]
30    pub ram_max_write_ports: usize,
31    /// Largest array, in stored bits, expanded into flip-flops after failing RAM
32    /// inference; a larger dynamically-indexed array is rejected, not expanded.
33    #[serde(default = "default_ram_max_ff_bits")]
34    pub ram_max_ff_bits: usize,
35}
36
37/// Built-in PDK library identifiers. Each variant maps to a hard-coded
38/// cell-data table in `veryl-synthesizer`.
39#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq, Eq)]
40pub enum Library {
41    /// SkyWater SKY130 130nm PDK (sky130_fd_sc_hd, Apache 2.0).
42    #[default]
43    #[serde(rename = "sky130")]
44    Sky130,
45    /// ASU ASAP7 7nm predictive PDK (asap7sc7p5t RVT, BSD 3-Clause).
46    #[serde(rename = "asap7")]
47    Asap7,
48    /// GlobalFoundries GF180MCU 180nm PDK (gf180mcu_fd_sc_mcu7t5v0,
49    /// Apache 2.0).
50    #[serde(rename = "gf180mcu")]
51    Gf180mcu,
52    /// IHP SG13G2 130nm SiGe BiCMOS PDK (sg13g2_stdcell, Apache 2.0).
53    #[serde(rename = "ihp-sg13g2")]
54    IhpSg13g2,
55}
56
57impl Default for Synth {
58    fn default() -> Self {
59        // Route through serde so the `default =` fn pointers are honoured
60        // — a naive derive(Default) would zero out the numeric fields.
61        toml::from_str("").unwrap()
62    }
63}
64
65fn default_timing_paths() -> usize {
66    1
67}
68
69fn default_clock_freq() -> f64 {
70    100.0
71}
72
73fn default_activity() -> f64 {
74    0.1
75}
76
77fn default_ram_min_bits() -> usize {
78    1024
79}
80
81fn default_ram_max_read_ports() -> usize {
82    16
83}
84
85fn default_ram_max_write_ports() -> usize {
86    8
87}
88
89fn default_ram_max_ff_bits() -> usize {
90    1 << 16
91}