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