https://mp.weixin.qq.com/s/v8plWCBD8vZkxykjJe4TCg
介绍AsyncCrossing的实现,主要介绍如何实现diplomacy Node和LazyModule相关内容。

1. TLAsyncCrossingSource
异步上游节点(源节点):

1) node:LazyModule的节点成员
node用于与其他diplomacy节点协商参数,在这里是一个异步上游节点:

TLAsyncSourceNode是一个适配器节点:

其使用实例如下:

每一条边在tilelink中是一个link,每条link必然包含a/d两个channel(TL-UL/TL-UH),可能包含b/c/e三条channel(TL-C)。

2) LazyModuleImp匿名子类的实例
TLAsyncCrossingSource是一个原子节点,其内部没有其他子节点。所以其实现只需要连接好输入边和输出边,实现处理逻辑即可。TLAsyncCrossingSource的处理逻辑是添加异步处理。

a. LazyModuleImp的匿名子类
花括号中定义的是LazyModuleImp的匿名子类。因为这个类只在这里使用一次,所以没有命名。

b. 实例化
这里的使用就是直接将其实例化:new LazyModuleImp(this) { ... }
3) 节点逻辑的实现
a. 取出一对输入输出边
适配节点把输入边适配之后,通过输出边输出,所以这里输入边和输出边成对取出:

b. 判断是否TL-C,即是否支持channel b/c/e:
Acquire/Probe都是处理Permission的Transfer消息,TL-C独有:

c. 对必然支持的channel a/d做异步处理

- 输入边的channel a(in.a)经过异步处理,输出到输出边的channel a(out.a);
- 输出边的channel d(out.d),经过异步处理,输出到输入边的channel d(in.d);
d. 若支持b/c/e,则对其做异步处理
根据channel方向的不同,使用ToAsyncBundle/FromAsyncBundle:

e. 若不支持b/c/e,则处理成:不打扰对方。

2. TLAsyncCrossingSink

1) node:LazyModule的节点成员
node用于与其他diplomacy节点协商参数,在这里是一个异步上游节点:

TLAsyncSinkNode也是一个适配器节点。
2) LazyModuleImp匿名子类的实例
a. LazyModuleImp的匿名子类
花括号中定义的是LazyModuleImp的匿名子类。因为这个类只在这里使用一次,所以没有命名。

b. 实例化
这里的使用就是直接将其实例化:new LazyModuleImp(this) { ... }
3) 节点逻辑的实现
a. 取出一对输入输出边
适配节点把输入边适配之后,通过输出边输出,所以这里输入边和输出边成对取出:

b. 判断是否TL-C,即是否支持channel b/c/e:
Acquire/Probe都是处理Permission的Transfer消息,TL-C独有:

c. 对必然支持的channel a/d做异步处理

- 输入边的channel a(in.a)经过异步处理,输出到输出边的channel a(out.a);
- 输出边的channel d(out.d),经过异步处理,输出到输入边的channel d(in.d);
d. 若支持b/c/e,则对其做异步处理
根据channel方向的不同,使用ToAsyncBundle/FromAsyncBundle:

e. 若不支持b/c/e,则处理成:不打扰对方。

3. 对比
1) TLAsyncCrossingSource的diplomacy节点定义为:


MixedAdapterNode传入了两个参数:TLImp, TLAsyncImp,分别作为InwardNodeImp, OutwardNodeImp:

也就是说输入边使用的是TLImp这一组类:

输出边使用的是TLAsyncImp这一组类:

TLImp这一组是标准接口:

TLAsyncImp这一组是添加了异步处理的接口:

所以对TLAsyncCrossingSource而言,输入边是标准的tilelink连接(link, 包含channel a/b/c/d/e), 而输出边是加了异步处理的tilelink连接。
异步信号从TLAsyncCrossingSource节点发出,所以是异步信号的上游节点(Source)。
2) TLAsyncCrossingSink的diplomacy节点定义为:

与TLAsyncCrossingSource相反:

其输入边为加了异步处理的TLAsyncBundle,输出边为TLBundle。
异步信号输入TLAsyncCrossingSink节点,所以是下游节点(Sink)。
3) 组合
TLAsyncCrossingSource和TLAsyncCrossingSink连接在一起,组成了一个异步适配结构。输入的TLBundle输入TLAsyncCrossingSource节点,经过这个适配结构异步处理之后,从TLAsyncCrossingSink的输出边输出。
4. TLAsyncCrossing
把TLAsyncCrossingSource和TLAsyncCrossingSink连接在一起:

1) 复合节点:包含子节点
这是一个复合节点,其内部包含source/sink两个子节点。
2) 子节点连接
这两个节点直接连在一起:sink.node := source.node。
3) 悬边(Dangle)
悬边是指子节点悬而未连的边。
source没有输入边,sink没有输出边。所以自成一体,不需要跟父节点连接。也就不存在需要父节点中转(forward)的悬边(Dangle)。
4) 适配器节点
source是一个适配器节点,但是并没有输入边连接,所以不能适配输入只能自行输出;
sink是一个适配器节点,但是并没有输出边连接,所以不能把输入适配出去,只能自行消化;
由此可以看出,适配器节点的特点是,有则适配,无则不适配。
5) 时钟和复位信号
source和sink这两个LazyModule包含时钟和复位信号,TLAsyncCrossing需要为他们引入时钟和复位信号。
5. 组合与继承
可以看到diplomacy Node是以组合的形式出现在各个LazyModule中的,如TLAsyncCrossingSource和TLAsyncCrossingSink中都有一个node成员。
这个意义是:
a. TLAsyncCrossingSource有一个(has a)异步处理上游节点(TLAsyncSourceNode);
b. TLAsyncCrossingSink有一个(has a)异步处理下游节点(TLAsyncSinkNode);
如果使用继承关系,意义就是:
a. TLAsyncCrossingSource是一个(is a)异步处理上游节点(TLAsyncSourceNode);
b. TLAsyncCrossingSink是一个(is a)异步处理下游节点(TLAsyncSinkNode);
两者在意义上不相同,在使用上灵活度也不同。这里权且提出这个问题,不做深入讨论。
- Rocket - tilelink - RegisterRouter
https://mp.weixin.qq.com/s/DaJhf7hEoWsEi_AjwSrOfA 简单介绍RegisterRouter的实现. 1. 基本介绍 实现挂在Tile ...
- Rocket - tilelink - Nodes
https://mp.weixin.qq.com/s/KJ8pVH76rdxPOZ1vE3QlKA 简单介绍tilelink对Diplomacy Nodes的实现. 1. TLImp ...
- Rocket - tilelink - mask
https://mp.weixin.qq.com/s/Gqv09RIgSSg5VKe-wb4aGg 讨论tilelink中使用MaskGen生成mask的用法. 1. tilelink中的ma ...
- Rocket - tilelink - Parameters
https://mp.weixin.qq.com/s/1I6DcONr0Mg7xiX8F1C7SQ 简单介绍TileLink相关的参数实现(具体问题暂时不展开,后续用到时再做分析). ...
- Rocket - tilelink - Bundles
https://mp.weixin.qq.com/s/jrqBg2AIpQogBrpwNXjmwg 简单介绍Bundles文件中对TileLink规范(1.7.1)的定义. 参考链接:https: ...
- Rocket - tilelink - TLBusWrapper.to
https://mp.weixin.qq.com/s/jSnhBzU5_ayQCg5fWAcx-g 简单介绍TLBusWrapper.to()的实现.主要介绍确定this{...}对应代码的过程. 1 ...
- Rocket - tilelink - BusWrapper
https://mp.weixin.qq.com/s/03BvgTNQtD75Guco6gUGQg 简单介绍BusWrapper的实现. 1. HasTLBusParams 定义SoC的挂 ...
- Rocket - tilelink - Xbar
https://mp.weixin.qq.com/s/UXFHYEQaYotWNEhshro68Q 简单介绍Xbar的实现. 1. 基本介绍 用于为Xbar的输入和输出连接生成内 ...
- Rocket - tilelink - WidthWidget
https://mp.weixin.qq.com/s/pmJcsRMviJZjMwlwYw6OgA 简单介绍WidthWidget的实现. 1. 基本介绍 用于设定与上游节点连接 ...
随机推荐
- 初识Matlab及界面认识
通过本章节的学习,需要掌握: MATLAB语言是什么 MATLAB在互联网语言中地位与应用 目标:利用MATLAB进行问题求解的基本规律.够使用MATLAB作为专业应用的工具. 1.什么叫计算? (1 ...
- (三)Redis &分布式锁
1 Redis使用中的常见问题和解决办法 1.1 缓存穿透 定义:缓存系统都是按照key去缓存查询,如果不存在对应的value,就应该去DB查找.一些恶意的请求会故意查询不存在的key,请求量很大,就 ...
- 【Hadoop离线基础总结】MapReduce倒排索引建立
MapReduce倒排索引建立 求某些单词在文章中出现多少次 有三个文档的内容,求hello,tom,jerry三个单词在其中各出现多少次 hello tom hello jerry hello to ...
- Java三大特征:封装 继承 多态
内部类:成员内部类.静态内部类.方法内部类.匿名内部类. 内部类:定义在另外一个类里面的类,与之对应,包含内部类的外部类被称为外部类. 内部类的作用:(1)内部类提供了更好的封装,可以把内部类隐藏在外 ...
- 【HDU4990】递推式
题目大意:给定序列 1, 2, 5, 10, 21, 42, 85, 170, 341 …… 求第n项 模 m的结果 递推式 f[i] = f[i - 2] + 2 ^ (i - 1); 方法一: ...
- 单线程和多线程执行对比—Python多线程编程
单线程和多线程执行对比 本章使用递归求斐波那契.阶乘与累加函数的执行来对比单线程与多线程: 斐波那契.阶乘与累加(mtfacfib.py): import threading from time ...
- Taro UI开发小程序实现左滑喜欢右滑不喜欢效果
前言:年后入职了一家新公司,与前同事交接完之后,发现公司有一个四端的项目(iOS,Android,H5,小程序),iOS和安卓都实现了左滑右滑的效果,而h5和小程序端没实现,询问得知前同事因网上没找到 ...
- Linux登录shell和非登录(交互式shell)环境变量配置
使用Jenkins执行shell脚本的时候, 碰到command not found. 比如java mvn, 这些环境变量配置在/etc/profile 中, 但jenkins执行的时候并没有加载. ...
- 感觉shopex现在的升级方式太慢了
我是说产品的更新,484,485是一个经典的版本,那时候免费,shopex 系统市场占用率很高.但是485以后呢,只有小版本的更新,fxw ,ekd 都是改进版本吧,没用特别大幅度的更新.5年前,10 ...
- 「雕爷学编程」Arduino动手做(41)---激光接收管模块
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...