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 - AsyncCrossing的更多相关文章

  1. Rocket - tilelink - RegisterRouter

    https://mp.weixin.qq.com/s/DaJhf7hEoWsEi_AjwSrOfA   简单介绍RegisterRouter的实现.   ​​   1. 基本介绍   实现挂在Tile ...

  2. Rocket - tilelink - Nodes

    https://mp.weixin.qq.com/s/KJ8pVH76rdxPOZ1vE3QlKA   简单介绍tilelink对Diplomacy Nodes的实现.   ​​   1. TLImp ...

  3. Rocket - tilelink - mask

    https://mp.weixin.qq.com/s/Gqv09RIgSSg5VKe-wb4aGg   讨论tilelink中使用MaskGen生成mask的用法.   1. tilelink中的ma ...

  4. Rocket - tilelink - Parameters

    https://mp.weixin.qq.com/s/1I6DcONr0Mg7xiX8F1C7SQ   简单介绍TileLink相关的参数实现(具体问题暂时不展开,后续用到时再做分析).   ​​   ...

  5. Rocket - tilelink - Bundles

    https://mp.weixin.qq.com/s/jrqBg2AIpQogBrpwNXjmwg   简单介绍Bundles文件中对TileLink规范(1.7.1)的定义. 参考链接:https: ...

  6. Rocket - tilelink - TLBusWrapper.to

    https://mp.weixin.qq.com/s/jSnhBzU5_ayQCg5fWAcx-g 简单介绍TLBusWrapper.to()的实现.主要介绍确定this{...}对应代码的过程. 1 ...

  7. Rocket - tilelink - BusWrapper

    https://mp.weixin.qq.com/s/03BvgTNQtD75Guco6gUGQg   简单介绍BusWrapper的实现.   1. HasTLBusParams   定义SoC的挂 ...

  8. Rocket - tilelink - Xbar

    https://mp.weixin.qq.com/s/UXFHYEQaYotWNEhshro68Q   简单介绍Xbar的实现.   ​​   1. 基本介绍   用于为Xbar的输入和输出连接生成内 ...

  9. Rocket - tilelink - WidthWidget

    https://mp.weixin.qq.com/s/pmJcsRMviJZjMwlwYw6OgA   简单介绍WidthWidget的实现.   ​​   1. 基本介绍   用于设定与上游节点连接 ...

随机推荐

  1. .NET Core+QQ第三方授权登录

    安装包 dotnet add package AspNet.Security.OAuth.QQ 接上文GitHub第三方授权登录 申请过程不介绍了,申请者资料,个人也是可以申请成功的. 这时候有二个参 ...

  2. LTE网络概述

    LTE主要由两部分组成:无线接入技术演进(E-UTRAN)+系统架构演进(SAE):其中,SAE主要含有的是演进型分组交换核心网(EPC),其控制处理部分为移动性管理实体(MME),数据承载部分称为业 ...

  3. Python 记录日志文件

    1.打印到控制台 # -*- coding: UTF-8 -*- import logging def logFileTest(): logging.debug('This is debug') lo ...

  4. [hdu4497]分解质因数

    题意:求满足gcd(x,y,z)=G,lcm(x,y,z)=L的x,y,z的解的个数. 大致思路:首先如果L % G != 0那么无解,否则令u = L / G,问题变为,gcd(r,s,t)=1,l ...

  5. Mybatis学习笔记汇总(包括源码和jar包)

    博客整理 Mybatis学习笔记(一)--对原生jdbc中问题的总结 Mybatis学习笔记(二)--Mybatis框架 Mybatis学习笔记(三)--入门程序 MyBatis学习笔记(四)--入门 ...

  6. Redis学习笔记(六) 对象

    前面我们看了Redis用到的主要数据结构,如简单动态字符串(SDS).双向链表.字典.压缩列表.整数集合等. 但是Redis并没有直接使用这些数据结构来实现键值对,而是基于这些数据结构创建了一个对象系 ...

  7. 基于 abp vNext 和 .NET Core 开发博客项目

    项目介绍 此个人博客项目底层基于 ABP Framework (不完全依赖)搭建项目 和免费开源跨平台的 .NET Core 3.1 开发,可作为 .NET Core 入门项目进行学习,支持各种主流数 ...

  8. 【题解】[SCOI2015]小凸玩矩阵

    题目链接 思路:题目要求变相解答一下,求出是否有n-k个数,不大于当前求的第k个数 而每一行每一列只能有一个数,就可以得到一个二分图的思路,边上的权值就是第i行第j列这个数的值 对于答案就是第k大的数 ...

  9. 基于VUE实现的h5网页Web出库单入库单打印设计

    经过将近一个月的研发,初步实现了打印单据的自定义设计,样子还有点丑陋,但是功能基本都实现了,实现了以下功能: 1.表头表尾支持动态添加行.添加列.合并单元格(可多行多列合并). 2.表头表尾分别布局, ...

  10. P3366【模板】最小生成树

    P3366[模板]最小生成树 Kruskal #include <bits/stdc++.h> using namespace std; typedef long long ll; ; ; ...