https://mp.weixin.qq.com/s/GWL41P1G1BXm2sTeLmckdA
介绍NodeHandle相关的类。
1. NoHandle
顶层类(trait),作为所有NodeHandle的父类型,没有定义特别操作。
2. InwardNodeHandle
主要用于实现节点绑定逻辑。
1) bind方法
委托给InwardNode.bind()实现;
2) 与NodeHandle连接
a. 连接
与Chisel3中相同,“:=”的意思为连接,左侧为下游,右侧为上游。上游流出为Outward,下游流入为Inward。
b. 多
按连接个数和方向,这四个方法分别代表了一对一、一对多、多对一、多对多这四种连接形式。
“*”代表连接个数不确定;
“*”与“=”的相对位置代表了哪一侧的个数不确定。个数不确定,需要根据实际情况确定(resolve)。
一对多是指一个上游节点发出多条连接,连接到下游节点,其形状为星型(star)。最终连接个数由多的一侧,也就是下游节点确定。
c. 实例
引自链接:https://www.lowrisc.org/docs/diplomacy/
The input crossbar crossbarI has three inwards connections with the three processors. However, there is only one connection with the cache that is set up by :=*. Similarly, the output crossbar has two outwards connections but only one inwards connection with cache set up by :*=. In other words, :=* means the number of connections is defined by the outwards side while :*= means the number of connections is defined by the inwards side.
d. 级联
连接的动作是可以级联的,如:
连接方法的返回值为InwardNodeHandle:
所以返回值可以作为连接符号的左侧,继续进行级联。
以“:=”为例,其方法签名和实现如下:
首先在参数中,把h看做是一个上游节点,要连接到this这一个下游节点;
然后在返回值,把h看做是一个下游节点,供级联时作为下游节点使用;
e. 类型
以“:=”为例,其方法签名如下:
InwardNodeHandle本身的参数类型为:
“:=”方法又声明了几个方法参数类型:
这些带X的参数类型是h引入的,作为h的DI/UI/EI/BI系列参数使用。
h的类型如下:
使用InwardNodeHandle类型的参数类型DI/UI/BI作为NodeHandle定义中的DO/UO/BO,这说明了这个定义使用的是简化模型,也就是上游节点的DO/UO/BO和下游节点的DI/UI/BI是同一个类型。
返回值的类型为:
这是h作为inner side的类型。
PS. EY为h的输出边,类型可以与this的输入边EI不同。这里不做讨论。
3) 与OutwardNodeHandle连接
上游节点h为OutwardNodeHandle类型,输出为NoHandle,不可级联。
3. OutwardNodeHandle
节点绑定有InwardNodeHandle实现,所以OutwardNodeHandle相对简单。
4. NodeHandle
NodeHandle既可以充当InwardNodeHandle也可以充当OutwardNodeHandle。
1) 与NodeHandle连接
连接后的两个节点组合成为一个整体,以上游节点h的输入为输入,以下游节点this的输出为输出:
2) 与OutwardNodeHandle连接
因为上游节点是一个OutwardNodeHandle,可以立即为一个只有输出没有输入的节点,所以返回的是一个OutwardNodeHandle,没有输入,以下游节点this的输出为输出:
5. NodeHandlePair
用于组合两个NodeHandle: