#模拟器 #后端 #测试 #集成电路

virt-ic

虚拟集成电路 - 后端集成电路模拟器

10 个版本

0.5.2 2023年3月24日
0.5.1 2023年3月24日
0.3.0 2020年6月14日
0.2.1 2020年6月11日
0.1.3 2020年6月7日

#33 in 模拟器

Download history 3/week @ 2024-03-12 36/week @ 2024-04-02 134/week @ 2024-04-16

每月下载量 59

MIT 许可证

215KB
5K SLoC

虚拟集成电路

变更日志

这个库是一个集成电路模拟器后端,可以模拟多个芯片之间的交互。

注意,目前主要是数字电路模拟,模拟信号有所体现,但仍需改进。

您首先创建一个板,注册芯片和迹线,并将芯片引脚连接在一起以形成一个虚拟电路。然后您可以运行电路来模拟芯片及其之间的连接。

这个库是一个后端模拟器,这意味着没有GUI来创建板。

关于 0.5.0 更新说明

为了简化这个crate的使用,移除所有那些降低代码可读性的 Rc<RefCell>,整个库已从头开始重写。因此,virt-ic 0.5.0 之前版本的 完全不兼容 新版本。

功能

  • 使用芯片和它们之间的迹线构建板
  • 以一定的步长和持续时间模拟板,也可以实时运行!
  • 保存和加载板以备份设计或稍后继续模拟

可用的内置芯片

  • 发生器
  • 逻辑门(与、或、非、与非、或非)
  • 按钮
  • 时钟
  • 存储器(RAM、ROM)
  • 段显示器
  • 中央处理器(6502,缺少中断和十进制模式)

贡献

此项目欢迎任何形式的贡献,从代码审查到直接贡献!您可以

  • 建议或改进当前代码
  • 建议或添加新功能
  • 建议或添加新的内置芯片
  • 欢迎任何倡议!

示例用法

use std::time::Duration;

use virt_ic::{
    board::{Board, Trace},
    chip::{gates::AndGate, generators::Generator, Chip, ChipBuilder, ChipType},
};

fn main() {
    // create a new board
    let mut board: Board<ChipType> = Board::new();
    // place an AND gate to the board
    let and_gate = board.register_chip(AndGate::build());
    // also place a generator
    let vcc = board.register_chip(Generator::build().into());
    let gnd = board.register_chip(Generator::build().with_state(virt_ic::State::Low).into());

    // Connect the AndGate's VCC, A and B pins with the Generator
    let mut trace = Trace::new();
    trace.connect(vcc, Generator::OUT);
    trace.connect(and_gate, AndGate::VCC);
    trace.connect(and_gate, AndGate::A);
    trace.connect(and_gate, AndGate::B);
    let trace_vcc = board.register_trace(trace);

    // Alternative way to connect chips via board, connect GND pins
    let trace_gnd = board.connect(gnd, Generator::OUT, and_gate, AndGate::GND);

    // simulate the board for 10ms
    board.run(Duration::from_millis(10));

    // check the results
    if let Some(chip) = board.get_chip(&and_gate) {
        println!(
            "A={:?}, \tB={:?}, \tA&B={:?}",
            chip.get_pin(AndGate::A).map(|p| p.state),
            chip.get_pin(AndGate::B).map(|p| p.state),
            chip.get_pin(AndGate::AB).map(|p| p.state)
        );
    }

    // disconnect AndGate's pin B from VCC and connect it instead to GND
    if let Some(t) = board.get_trace_mut(&trace_vcc) {
        t.disconnect(and_gate, AndGate::B)
    }
    if let Some(t) = board.get_trace_mut(&trace_gnd) {
        t.connect(and_gate, AndGate::B)
    }

    // simulate the board for another 10ms
    board.run(Duration::from_millis(10));

    // check the results
    if let Some(chip) = board.get_chip(&and_gate) {
        println!(
            "A={:?}, \tB={:?}, \tA&B={:?}",
            chip.get_pin(AndGate::A).map(|p| p.state),
            chip.get_pin(AndGate::B).map(|p| p.state),
            chip.get_pin(AndGate::AB).map(|p| p.state)
        );
    }
}

文档

请参阅 生成的文档

示例

请参阅 示例

  • extend:如何通过扩展内置芯片集添加自定义芯片的示例
  • pins:使用 Pin::read 和 Pin::write 读取和写入一组引脚
  • ram:RAM 芯片的简单测试
  • readme:与本说明中提供的相同的示例
  • save:板保存和加载示例
  • segment-display:简单的段显示器测试
  • sr-latch:工作 SR-Latch 的示例
  • test-6502:使用小型程序和基本的ROM和RAM布局测试Nes6502 CPU

依赖项

~0.7–1.5MB
~33K SLoC