4 个版本
0.0.5 | 2024年6月5日 |
---|---|
0.0.4 | 2024年6月5日 |
0.0.3 | 2024年6月4日 |
0.0.2 | 2022年3月14日 |
#498 在 解析器实现 中
每月112 次下载
315KB
7K SLoC
LEF/DEF 解析器和写入器
LEF (库交换格式) 和 DEF (设计交换格式) 是描述标准单元库、技术数据(LEF)和包括布局和网络表在内的整个设计的行业标准文件格式(DEF)。
此crate提供了这些格式的输入和输出函数,包括它们的表示数据结构。
文档
文档由源代码生成
git clone [this repo]
cd [this repo]
cargo doc --open
或者找到托管在此的文档 这里。
待办事项
- 支持 serde
参考
许可证
- 程序代码根据 AGPLv3 许可证授权。
- 一些来自 FreePDK45 和 Sky130 的测试数据根据 Apache 2.0 许可证授权。
lib.rs
:
LibrEDA 框架的 LEF 和 DEF 输入/输出。
LEF 和 DEF 有它们自己的数据结构,这些结构非常接近这两种文件格式。`import` 模块提供将 LEF 和 DEF 结构转换为支持 L2NEdit
特性的类型的函数。类似地,`export` 模块帮助将 L2NBase
类型转换为 DEF 结构。
当前限制
目前尚未实现 LEF 的写入器,因为通常布局和路由工具不会修改 LEF 文件。还没有这个需求。
从 LEF 和 DEF 的数据导入还相当有限。从 DEF 中没有导入路由信息。目前,从 DEF 导入设计仅适用于布局和路由的输入,而不是后布局阶段。
示例
读取并导入 LEF 文件
use std::fs::File;
use std::io::BufReader;
use libreda_lefdef::lef_parser;
// Open a LEF file.
let f = File::open("./tests/data/lef_examples/freepdk45/gscl45nm.lef").unwrap();
// Create a buffered reader for faster reading.
let mut buf = BufReader::new(f);
// Read the LEF data.
let result = lef_parser::read_lef_bytes(&mut buf);
if result.is_err() {
// Handle IO errors and parsing errors.
println!("Failed to parse LEF: {:?}", result);
}
// Access the LEF structure.
let lef = result.expect("Failed to parse LEF.");
// Import a LEF library into the DB format.
use libreda_lefdef::import;
use libreda_lefdef::libreda_db::prelude::*;
let mut chip = Chip::new();
let import_options = import::LEFImportOptions::default();
import::import_lef_into_db(&import_options, &lef, &mut chip)
.expect("Failed to import LEF.");
读取并导入 DEF 文件
use std::fs::File;
use std::io::BufReader;
use libreda_lefdef::def_parser;
// Open a DEF file.
let f = File::open("./tests/data/def_examples/dummy.def").unwrap();
// Create a buffered reader for faster reading.
let mut buf = BufReader::new(f);
// Read the LEF data.
let result = def_parser::read_def_bytes(&mut buf);
if result.is_err() {
// Handle IO errors and parsing errors.
println!("Failed to parse DEF: {:?}", result);
}
// Access the DEF structure.
let def = result.expect("Failed to parse DEF.");
// Import a DEF design into the DB format.
// Note that in this example the DEF file does not contain any components (cell instances)
// because otherwise this example would require to also import a (LEF) library first.
use libreda_lefdef::import;
use libreda_lefdef::libreda_db::prelude::*;
// Create an empty layout.
let mut chip = Chip::new();
let mut import_options = import::DEFImportOptions::default();
// Disable import of wiring for the sake of simplicity.
// This way, a LEF structure is not necessary during the DEF import.
import_options.import_wiring = false;
// Start the import.
import::import_def_into_db(&import_options, None, &def, &mut chip)
.expect("Failed to import DEF.");
导出到 DEF
设计可以导出到 DEF。然而,DEF 有一个扁平的层次结构,只支持顶层设计以及称为 'components' 的子实例。设计最终必须被展平,然后才能导出到 DEF。
导出到 DEF 首先创建一个 DEF 数据结构,然后可以进行序列化。
use libreda_lefdef::libreda_db::prelude::*;
use libreda_lefdef::DEF;
use libreda_lefdef::export::{export_db_to_def, DEFExportOptions};
// Create a design to be exported.
let mut chip = Chip::new();
let outline_layer = chip.create_layer(1, 0); // Outline layer is necessary for exporting to DEF.
// The design must contain at least one cell, which will be the top-level.
let top = chip.create_cell("TOP".into());
// Create cell outline.
chip.insert_shape(&top, &outline_layer, Rect::new((0, 0), (10, 10)).into());
// Populate a DEF structure with the data from the `chip`.
let mut def = DEF::default();
let mut options = DEFExportOptions::default();
options.outline_layer = Some(outline_layer);
// Do the conversion.
let result = export_db_to_def(&options, &chip, &top, &mut def);
assert!(result.is_ok()); // Handle errors.
写入 DEF
可以将 DEF
结构序列化为 DEF 格式。
use libreda_lefdef::DEF;
use libreda_lefdef::def_writer::*;
// Create a new empty DEF.
let mut def = DEF::default();
// Fill it with data. Consider using the export functions for this.
def.design_name = Some("MyDesign".to_string());
// Serialize to a 'writer'. This can be any type implementing the `Write` trait.
let mut buffer: Vec<u8> = Vec::new();
let result = write_def(&mut buffer, &def);
assert!(result.is_ok()); // Handle errors.
依赖关系
~5.5MB
~113K SLoC