graph TD V["Verilog\n.v"] --> Y["Yosys\nSynthesis"] Y --> J["Netlist\nJSON\n(modules, cells, nets)"] Y --> L["Liberty\n.lib\n(timing, power)"] Y --> E["EDIF\n.edf"] J --> R["Rust\nAnalysis"] style J fill:#5E81AC,stroke:#88C0D0 style R fill:#A3BE8C,stroke:#81A1C1
graph LR T["TopSeed\n{creator, modules}"] --> M["ModulesSeed\n{mod1, mod2, β¦}"] M -->|first only| MOD["ModuleSeed\n{cells, ports, netnames}"] MOD --> C["CellsSeed\n{cell1, cell2, β¦}"] MOD --> P["PortsSeed\n{port1, port2, β¦}"] MOD --> N["NetnamesSeed\n{net1, net2, β¦}"] C --> CE["CellSeed\n{type, connections}"] CE --> CO["ConnectionsSeed\n{port β [net_ids]}"] P --> PO["PortSeed\n{direction, bits}"] style T fill:#5E81AC,stroke:#88C0D0 style CO fill:#A3BE8C,stroke:#81A1C1 style PO fill:#A3BE8C,stroke:#81A1C1 style N fill:#BF616A,stroke:#D08770
sequenceDiagram participant F as File participant D as serde_json::Deserializer participant S as TopSeed participant M as ModulesSeed participant MOD as ModuleSeed F->>D: bytes D->>S: deserialize_any() S->>D: visit_map() D->>S: key("modules") S->>M: next_value_seed() M->>D: visit_map() D->>M: key("top") M->>MOD: next_value_seed() MOD->>D: visit_map() D->>MOD: key("cells") MOD-->>CELL: next_value_seed(CellsSeed) Note over MOD: Only first moduleprocessed β rest skipped
flowchart TD subgraph Data["π¦ Collected Data"] CN["cell_names\n[and1, buf2, β¦]"] PN["port_names\n[clk, rst_n, β¦]"] NI["all_net_ids\n{0, 1, 2, β¦}"] CE["cell_edges\n[(0,87), (0,88), β¦]"] PB["port_bits\n{clkβ[2], β¦}"] end subgraph Net["π Netlist"] M["Modules\n(cells + PORT_ports)"] N["Nets\n(net_id as string)"] E["Edges\n(cellβnet, portβnet)"] W["Metadata\n(weights, fixed)"] end CN --> M PN --> M NI --> N CE --> E PB --> E style Data fill:#5E81AC,stroke:#88C0D0 style Net fill:#A3BE8C,stroke:#81A1C1
xychart-beta title "Rust DOM vs SAX (ms β lower is better)" x-axis ["small_100", "med_500", "large_2k"] y-axis "Mean (ms)" 0 --> 35 bar [2.11, 7.60, 28.2] bar [1.66, 5.32, 21.4]
graph TD subgraph Rust["π¦ Rust β 20-30% SAX win"] RD["DOM: serde_json::from_reader"] RS["SAX: DeserializeSeed"] end subgraph Python["π Python β Mixed results"] PD["DOM: json.load()"] PS["SAX: ijson.parse()"] end subgraph Cpp["π§ C++ β 1.6-5Γ SAX win"] CD["DOM: json::parse()"] CS["SAX: json::sax_parse()"] end RD -->|"2 ms"| RR["Result"] RS -->|"1.7 ms"| RR PD -->|"31 ms"| PR["Result"] PS -->|"19 ms"| PR CD -->|"24 ms"| CR["Result"] CS -->|"5 ms"| CR style RS fill:#A3BE8C,stroke:#81A1C1 style CS fill:#A3BE8C,stroke:#81A1C1 style PS fill:#EBCB8B,stroke:#81A1C1
flowchart LR subgraph Input["π Input"] J["Yosys JSON File\n(483 KB β sphere_netlist)"] end subgraph Sax["β‘ SAX Parser\n9 DeserializeSeed types"] P["Event Stream\nserde_json::Deserializer"] S["State Machine\nMapAccess + SeqAccess"] C["Collected Data\nYosysSaxData (5 Vecs/Sets)"] end subgraph Build["π Assembly"] G["Bipartite Graph\npetgraph::Graph"] N["Netlist Object\nNetlist"] end J -->|"read_yosys_json_sax()"| P P --> S S --> C C --> G G --> N style Sax fill:#5E81AC,stroke:#88C0D0 style Build fill:#A3BE8C,stroke:#81A1C1