介绍UserModule类中,如何管理构建硬件模型所需的命令。
 
 
1. _commands
 
private val _commands = ArrayBuffer[Command]()
 
_commands中存放了构建模块所需的全部命令。
 
 
1) 添加命令:addCommand
 
a. 需要没有close:_closed意为模块构建所需已经齐备,不能再向其中添加内部数据和逻辑定义;
b. 把c添加到_commands中;
 
2) 获取所有命令:getCommands
 
 
a. 需要已经close,意为模块构建所需已经齐备;
b. 返回全部命令:_commands.toSeq
 
2. Builder.pushCommand()
 
 
addCommand()通过pushCommand()调用,将命令c添加到正在构建的模块(forcedUserModule)之中。
 
3. _closed
 
 
_closed定义与BaseModule类中,为该类数据成员,protected表明子类可以直接读写访问。
 
_closed是一个标志:标志着模块定义是否已经完成,即所需的各个内部数据变量、内部逻辑是否已经全部添加到模块中。亦即构建模块的硬件模型所需的所有命令已经齐备,可以开始构建了。
 
总结并简而言之,即过程分为两个阶段:定义、构建。而_closed标志着模块定义阶段的结束。也可以用来表明可以开始构建阶段了。
 
 
4. forcedUserModule
 
pushCommand()调用forcedUserModule.addCommand(c)把命令c加入到forcedUserModule中。
 
forcedUserModule定义如下:
可知,其为Option包裹着的UserModule,即currentModule拆包而来;
 
currentModule定义如下:
currentModule基于动态上下文(dynamicContext)中定义的变量currentModule。其赋值可以直接使用“currentModule = xxx”的形式。
 
currentModule定义与Builder类中,其赋值的地方为:
 
直接定义在BaseModule的类体中,每一个BaseModule类的子类实例化时,都要执行这个代码。所以Builder.currentModule的值即为当前实例化的模块。
 
如下代码中FullAdder即为Module的子类,亦即BaseModule的子类:
 
所以new FullAdder()时,会执行到Builder.currentModule = Some(this)这行代码,而把currentModule设置为正在创建(new)的这个FullAdder模块。
 
所以后续pushCommand()时,都是添加到这个FullAdder模块中。
 
 
 

Chisel3 - model - UserModule commands的更多相关文章

  1. Chisel3 - model - 子模块,顶层模块

    https://mp.weixin.qq.com/s/3uUIHW8DmisYARYmNzUZeg   介绍如何构建由模块组成的硬件模型.   1. 子模块   一个模块可以有一个或多个子模块,创建子 ...

  2. Chisel3 - model - Builder

    https://mp.weixin.qq.com/s/THqyhoLbbuXXAtdQXRQDdA   介绍构建硬件模型的Builder.   1. DynamicContext   ​​ 动态上下文 ...

  3. Chisel3 - model - IO ports

    https://mp.weixin.qq.com/s/fgCvIFt0RdEajhJVSy125w   介绍模块的输入输出端口的定义与管理.     1. _ports   1) 模块的输入输出端口, ...

  4. Chisel3 - model - when

    https://mp.weixin.qq.com/s/YGTXky4wff7LXUphUxISQg   介绍创建模块判断逻辑的when命令.   1. when/elsewhen/otherwise ...

  5. Chisel3 - model - DefWire, Reg, Memory, Prim

    https://mp.weixin.qq.com/s/KkkqvekWHG6yrqwHUECRIw   介绍如何定义Wire/Reg/Memory/Prim.   1. DefWire   Wire( ...

  6. Chisel3 - model - connect

    https://mp.weixin.qq.com/s/w8NqM3GVlF0NydpsB65KPg   介绍创建模块顺序逻辑的connect命令.     0. 这里先简单对 "=" ...

  7. Chisel3 - model - Hardware Model

    https://mp.weixin.qq.com/s/x6j7LZg7i7i_KcNEA8YCQw   Chisel作为领域专用语言(DSL),用于构建硬件模型.待硬件模型建立后,再基于模型进行仿真. ...

  8. 领域驱动设计常见问题FAQ

    本文出处:http://www.cqrs.nu/Faq What is a domain? The field for which a system is built. Airport managem ...

  9. CQRS FAQ (翻译)

    我从接触ddd到学习cqrs有6年多了, 其中也遇到了不少疑问, 也向很多的前辈牛人请教得到了很多宝贵的意见和建议. 偶尔的机会看到国外有个站点专门罗列了ddd, cqrs和事件溯源的常见问题. 其中 ...

随机推荐

  1. LeetCode--LinkedList--206. Reverse Linked List(Easy)

    206. Reverse Linked List(Easy) 题目地址https://leetcode.com/problems/reverse-linked-list/ Reverse a sing ...

  2. Openwrt:添加"自定义软件包.ipk"

    我们已经尝试做的一件事情,是让移植软件到OpenWrt的操作变得非常容易.如果打开OpenWrt里的一个软件包的目录(OpenWrt/Package/* 或 OpenWrt/feeds/package ...

  3. 一篇博客带你轻松应对Springboot面试

    1. SpringBoot简介 SpringBoot是简化Spring应用开发的一个框架.他整合了Spring的技术栈,提供各种标准化的默认配置.使得我们可以快速开发Spring项目,免掉xml配置的 ...

  4. Java网络小结

    1,定位 IP对机器的定位 端口对软件的定位(65535) URL对软件上每一份资源的定位 2,TCP和UDP TCP 安全,性能低 ①ServerSocket②Socket UDP不安全,性能高 ① ...

  5. [hdu4714 Tree2cycle]树形DP

    题意:给一棵树,删边和加边的代价都为1,求把树变成一个圈所花的最小代价. 思路:对原树进行删边操作,直到将原树分成若干条链,然后通过在链之间添加边形成圈,由于删边和加边一一对应,且最后需要额外一条边连 ...

  6. PHP正则表达式语法汇总

    首先,让我们看看两个特别的字符:'^' 和 ‘$' 他们是分别用来匹配字符串的开始和结束,一下分别举例说明"^The": 匹配以 "The"开头的字符串;&qu ...

  7. elasticsearch 小总结

    elasticsearch 小总结 0. 起因 距离初次写关于es的文章 https://blog.csdn.net/aca_jingru/article/details/44488703 已经过去4 ...

  8. 3.8 Go Array数组

    3.8 Go Array数组 数组是固定长度的特定类型元素组成的序列. 一个数组由零或多个相同类型元素组成. 数组的长度是固定,因此Go更常用Slice(切片,动态增长或收缩序列). 数组是值类型,用 ...

  9. javascript 获取页面的高度及滚动条的位置的代码

    http://www.jb51.net/article/23331.htm javascript 获取页面的高度及滚动条的位置的代码 作者: 字体:[增加 减小] 类型:转载   javascript ...

  10. SpringBoot之整合MongoDB

    MongoDB官网安装:https://www.mongodb.com/download-center/community MongoDB客户端工具(Mongo Management Studio)安 ...