介绍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模块中。