#verilog #parser #structural #connection #netlist #module #framework

libreda-structural-verilog

作为 Yosys 创建的解析器用于结构化 Verilog

3 个版本

0.0.5 2024 年 6 月 7 日
0.0.4 2024 年 6 月 4 日
0.0.3 2021 年 12 月 10 日

#1172解析器实现

Download history 216/week @ 2024-06-01 50/week @ 2024-06-08 6/week @ 2024-06-15 1/week @ 2024-06-22

118 每月下载次数
libreda-sta 中使用

AGPL-3.0-or-later

70KB
1K SLoC

为 LibrEDA 提供的 Verilog 网表 I/O

此 crate 实现了 LibrEDA 框架用于 Yosys 所使用的 Verilog 网表格式的 NetlistReaderNetlistWriter

仅支持 Verilog 的一部分,即 '结构化' 或 '网表' Verilog。它仅由模块、模块实例化和端口连接组成。


lib.rs:

此 crate 为网表到 Yosys 所使用的 Verilog 格式的序列化和反序列化提供支持。读者和编写者实现了 LibrEDA 数据库的 NetlistReaderNetlistWriter 特性。

示例

读取网表

典型的网表使用来自库的标准单元,因此标准单元的定义不包含在网表本身中,而是在另一个文件中。

在此示例中,首先读取库网表,以便加载所有标准单元定义。然后加载包含实际电路的网表。

use std::fs::File;
use libreda_db::prelude::*;
use libreda_structural_verilog::StructuralVerilogReader;

// Locations of the library and the netlist.
let library_path = "./tests/test_data/standard_cells.v";
let file_path = "./tests/test_data/my_chip_45_nl.v";
let mut f_library = File::open(library_path).unwrap();
let mut f_netlist = File::open(file_path).unwrap();

// Create an empty netlist that will be populated from files.
let mut netlist = Chip::new();

// Create a reader that reads only cell definitions but does not care about
// the internals of the cell.
let library_reader = StructuralVerilogReader::new()
        .load_blackboxes(true);

// Read the library.
library_reader.read_into_netlist(&mut f_library, &mut netlist).expect("Error while reading library.");

// Read the netlist with a default reader (does not load black-boxes but populates the cells with content).
let reader = StructuralVerilogReader::new();
reader.read_into_netlist(&mut f_netlist, &mut netlist).expect("Error while reading netlist.");

依赖关系

~8–12MB
~202K SLoC