zoukankan      html  css  js  c++  java
  • jchdl

     
    org.jchdl.model.gsl.core.meta.Node.java
     
    generated by Intellij IDEA powered by yFiles
     
    Node为所有节点的父类。所有用户创建的节点,必须继承Node类。Node为用户创建了节点提供了很多支持方法,但把logic()方法留给子类自行定义。
     
    一. 类结构
     
     
    主要属性:
    1. netI:连接在节点Input接口上的线;
    1. netO: 链接在节点Output接口上的线;
    1. ioI:节点的Input接口,与netI中的线一一对应;
    1. ioO:接口Output接口,与netO中的线一一对应;
     
    主要方法:
    1. 收集连接在接口Input接口上的线的方法:
    1. in(Net): 添加一条输入线;
    1. in(Net[]):添加一组输入线;
    1. 收集连接在接口Output接口上的线的方法:
    1. out(Net): 添加一条输出线;
    1. out(Net[]):添加一组输出线;
    1. 获取节点Input接口的方法:
    1. in(int index): 获取第index个Input接口;
    1. inputs(): 获取所有的Input接口;
    1. inputs(int from):获取从from开始的所有接口;
    1. inputs(int from, int to):[from, to),获取从from(包含)到to(不包含)的所有接口;
     
    1. 获取节点Output接口的方法:
    1. out(int index): 获取第index个Output接口;
    1. outputs(): 获取所有的Output接口;
    1. outputs(int from):获取从from开始的所有接口;
    1. outputs(int from, int to):[from, to),获取从from(包含)到to(不包含)的所有接口;
     
    1. 节点内部逻辑构建方法:logic()
    该方法为抽象方法,留给子类自行定义,即用户通过重新定义该方法,来实现节点的自定义逻辑。
     
    1. 节点构建方法:construct()
    辅助方法,下面单讲。
     
    1. 转换为Verilog的方法:toVerilog()
    把节点转换为Verilog的(门和开关层结构建模)实现。
     
    二. 构建节点
     
    当前构建节点的方法如下:
    1. 收集节点构造方法中提供的输入线和输出线;
    1. 调用construct()方法:
    1. 根据收集的输入线和输出线,分别创建足够数量的Input接口和Output接口与之对应;
    1. 调用用户自定义的logic()方法构建节点内部逻辑;
    1. 将输入线和输出线与节点的Input接口和Output接口一一连接;
    如此即完成节点构建。
     
    三. 用户自定义逻辑:logic()
     
    用户自定义逻辑的方法是在子类中覆盖logic方法。logic方法主要做以下事情:
     
    1. 创建线或一组线从Input接口牵出。(创建线时即可自动将Input接口连接到新创建的线的Input接口上,从而驱动(driven)线)
    1. 创建线或一组线连接到Output接口。(创建线时即可自动把线的Output接口连接到节点的Output接口上)
    1. 创建内部子节点;(创建内部子节点时,即可自动把Input牵出作为子节点输入线的线,连接到子节点的Input接口上;并且自动把子节点的Output接口连接到子节点的输出线上)
     
    另外,可以通过pullup/pulldown来处理临时需要的线;使用toGround()处理不再需要的线。
     
    注意:logic内部使用的线,属于节点的一部分,最好是定义为节点类的属性。
     
    四. 总结
     
    可以看出,节点的构建其实就是连线:
    1. 把输入线连到Input接口上;
    1. 从Input接口牵出线连到内部子节点上;
    1. 从内部子节点牵出线连接到Output接口上;
    1. Output接口牵出线以供后续使用;(连接到下一个节点,或者接地,或者悬空供观察使用)
     
    五. 实例Mux
     
    Mux为二选一。
     
    1. 构造函数
    构造函数的参数为输入线和输出线,使用in()和out()分别收集:
    1. 收集输入线 in1, in2, sel;
    1. 收集输出线out;
    1. 调用construct方法构建Mux节点;
     
    1. 内部逻辑
    1. 从输入口牵出线,比如:
    in1 = new Wire(in(0))
    其中,in(0)方法为Node类提供的辅助方法,获取第0个Input接口;
    然后创建一条线,从这第0个Input接口牵出。
    1. 创建线连接到输出口,比如:
    out = new Wire(out(0))
    out(0)方法为Node类提供的辅助方法,获取第0个Output接口;
    然后创建一条线,连接到这个输出口上;
    1. 创建子节点Not需要的输出线selNot;
    1. 创建字节点Not:sel作为输入线,selNot作为输出线;
    1. 同理,逐个创建子节点:两个与门,一个或门;
     
    1. 节点内部的线
     
    节点内部使用的线,推荐作为节点属性声明:
     
    1. 创建Mux节点
     
    PS. inst静态方法可以省略new关键字,使代码更紧凑。
     
    六. 原子节点(AtomicNode)
     
    原子节点是节点的子类。覆盖了logic方法,但实现为空。
     
    该类定义了抽象方法atomic()供子类覆盖,以实现从输入到输出的转化逻辑。最简单的比如非门:
     
    atomic()方法调用not()方法,实现从输入到输出值的转换。
     
  • 相关阅读:
    POJ 3253 Fence Repair
    POJ 2431 Expedition
    NYOJ 269 VF
    NYOJ 456 邮票分你一半
    划分数问题 DP
    HDU 1253 胜利大逃亡
    NYOJ 294 Bot Trust
    NYOJ 36 最长公共子序列
    HDU 1555 How many days?
    01背包 (大数据)
  • 原文地址:https://www.cnblogs.com/wjcdx/p/9616068.html
Copyright © 2011-2022 走看看