3 个版本

0.0.3 2023 年 5 月 17 日
0.0.2 2023 年 1 月 15 日
0.0.1 2023 年 1 月 15 日

#8 in #vhdl

GPL-3.0 许可证

120KB
3K SLoC

source_generator

一个为需要源代码生成的应用程序提供基本源代码生成功能的库。

VHDL 生成

VHDL 源代码生成基于 VHDL 2008 的逆 BNF 并进行了一些简化。示例 vhdl/adder.rs 展示了简单 VHDL 加法器设计的创建。

fn main() -> Result< (), std::io::Error > {
    let mut adder = Entity::new( "adder" );
    adder.add_library_use( LibraryUse::new( "ieee", "numeric_std" ) );
    adder.add_generic( Generic::new_with_default( "SIZE", "positive", "32" ) );
    adder.add_port( Port::new( "a", Direction::IN, "unsigned( SIZE - 1 downto 0 )" ) );
    adder.add_port( Port::new( "b", Direction::IN, "unsigned( SIZE - 1 downto 0 )" ) );
    adder.add_port( Port::new( "c", Direction::OUT, "unsigned( SIZE - 1 downto 0 )" ) );

    let mut rtl = Architecture::new( "rtl", adder );
    rtl.add_signal_assignment( SignalAssignment::new_with_label( "add", "c", "a + b" ));

    let mut vhdl_file = VhdlFile::new( "examples/vhdl/adder.vhd" );
    vhdl_file.add_architecture( rtl );

    vhdl_file.write()?;
}

此设计包含一个具有两个输入端口和一个输出端口的实体。生成的架构对两个输入进行加法并写入输出。

基于此代码生成程序,创建了以下 VHDL 代码。

library ieee;
    use ieee.numeric_std.all;

entity adder is
    generic (
        SIZE : positive := 32
    );
    port (
        a : in unsigned( SIZE - 1 downto 0 );
        b : in unsigned( SIZE - 1 downto 0 );
        c : out unsigned( SIZE - 1 downto 0 )
    );
begin
end entity adder;

architecture rtl of adder is
begin
    add: c <= a + b;
end architecture rtl;

依赖项

~3–4.5MB
~112K SLoC