https://mp.weixin.qq.com/s/9nikweQUGG5FO3Z8t6feaw

介绍Parameters中定义的fastProperty的实现。(使用最近的新版本,差别不大)
 
 
1. groupByIntoSeq
 
用于把列表中的每个元素,使用键值(key value)函数f进行分组,然后返回分组结果。
 
1) 两个参数列表:
a. (xs: Seq[A]): A为列表元素的类型,xs为待分组元素的序列;
b. (f: A => K): K为键值的类型,f为计算每个元素(A)键值(K)的函数;可以理解为对每个元素计算哈希值,以方便归入某一个类别。
 
2) 返回值:Seq[(K, immutable.Seq[A])]
a. 元组:(K, immutable.Seq[A]),二元组的第一个元素为键值,第二个为归为此类的元素,这些元素来自于输入参数xs;
b. 键值不止一个,所以返回的是一个二元组的序列。这个序列构成了分组结果;
 
3) 实现
 
a. 创建一个空的有连接的哈希映射:
val map = mutable.LinkedHashMap.empty[K, mutable.ListBuffer[A]]
所谓有连接,即是记录键值对加入Map中的先后顺序,后续遍历时根据这个顺序进行。
 
b. 计算键值:val key = f(x)
c. 如果这个键值当前没有映射任何元素,则创建一个空的ListBuffer:
val l = map.getOrElseUpdate(key, mutable.ListBuffer.empty[A])
d. 如果有,则取出key映射的ListBuffer:
val l = map.getOrElseUpdate(key, mutable.ListBuffer.empty[A])
e. 把x加入到l中:l += x
f. 逐个循环每一个输入元素,进行分组:for (x <- xs) {}
g. 把映射表中的映射,转换为二元组:case (k, vs) => k -> vs.toList }。
h. 因为使用的容器是LinkedHashMap,所以转换产生的二元组链表的顺序,跟键值对加入到Map中的顺序一致:map.view.map(...).toList
 
2. fastPropertyGroup
 
基于groupByIntoSeq,使用manager的属性进行分组:
 
1) 使用groupByIntoSeq
 
两个参数列表:
a. 元素列表xs:managers.map(m => (p(m), m.address)),每个元素是一个二元组。
 
二元组第一个元素为p(m)计算得出的键值(K),第二个元素为manager的地址集合。
p是一个函数,他使用参数TLManagerParameters,返回一个K类型的键值。
 
b. 计算键值函数f:_._1
 
这是一个函数,展开形式为:(tuple: Tuple2[K, Seq[AddressSet]]) => tuple._1
 
c. 返回值:二元组序列
 
二元组第一个元素:K,第二个元素为K分组中各个m的address(m.address)的序列。
 
2) 把分组中各个manager的地址集合序列组成一个大的序列:
其中:vs的类型
 
3) 找出区分各个分组的最少的比特位
 
Seq[AddressSet]为一个分组支持的全部地址集合,在AddressDecoder中被成为Port;
Seq[Seq[AddressSet]]为各个分组支持的地址集合,在AddressDecoder中被称为Ports;
 
AddressDecoder的作用是找出区分各个Port的地址的最少的比特集合;
 
4) 尽量合并每个分组的地址集合
 
5) 返回值:Seq[(K, Seq[AddressSet])]
 
返回的是分组之后,需要处理的每个分组的地址集合序列。如注释中所说:Compute the simplest AddressSets that decide a key。
 
3. fastProperty
 
选择一个属性进行分组,然后判断地址属于哪一个分组:
 
1) 待判断的地址:address;
2) 选择熟悉并计算键值的函数:p: TLManagerParameters => K;
3) 通过分组键值,转换为输出的函数:d: K => D;
4) 判断地址集合序列是否包含待判断地址:a.map(_.contains(address)).reduce(_||_)
5) 把键值转换为输出:d(v)
6) 独热码输出分组键值转换后结果:Mux1H((a.map(_.contains(address)).reduce(_||_), d(v))*)
 
4. findFifoIdFast
 
这是一个使用fifoId进行分组的实例。查找地址属于哪一个fifoId:
 
1) 选择属性并计算键值的函数p:_.fifoId.map(_+1).getOrElse(0)
 
这里选择的熟悉为fifoId。计算出的键值为整数类型。
 
2) 函数d把分组键值转换为可使用的逻辑:(i:Int) => UInt(i)
 
键值i是实际的fifoId+1,如果没有fifoId则为0。函数d把键值直接存入UInt变量,供其他逻辑使用。
 
5. hasFifoIdFast
 
又一个实例:
 
1) 使用属性fifoId是否定义,把所有managers分成两组:_.fifoId.isDefined;
2) 根据address所属分组,判断address是否属于一个fifoId:(b:Boolean) => Bool(b);

Rocket - tilelink - fastProperty的更多相关文章

  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 - AsyncCrossing

    https://mp.weixin.qq.com/s/v8plWCBD8vZkxykjJe4TCg   介绍AsyncCrossing的实现,主要介绍如何实现diplomacy Node和LazyMo ...

  4. Rocket - tilelink - mask

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

  5. Rocket - tilelink - Parameters

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

  6. Rocket - tilelink - Bundles

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

  7. Rocket - tilelink - TLBusWrapper.to

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

  8. Rocket - tilelink - BusWrapper

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

  9. Rocket - tilelink - Xbar

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

随机推荐

  1. VM虚拟机手动配置IP地址

    1.查看虚拟机的网关 编辑-->虚拟网络编辑器 VMnet8 NAT模式-->NAT设置-->网关IP 2.设置IP地址 系统-->首选项-->网络连接 system e ...

  2. 王颖奇 20171010129《面向对象程序设计(java)》第十周学习总结

    实验十  泛型程序设计技术 实验时间 2018-11-1 1.实验目的与要求 (1) 理解泛型概念: (2) 掌握泛型类的定义与使用: (3) 掌握泛型方法的声明与使用: (4) 掌握泛型接口的定义与 ...

  3. 数据预处理 —— padding数据

    1. 论Conv2d()里的padding和Conv2d()前padding的区别及重要性.   小生建议,尽量少用Conv2d()里的填充方式,换成自定义填充方式(强烈建议).   小生为何这样建议 ...

  4. 【Hadoop离线基础总结】Hive级联求和

    Hive级联求和 建表 CREATE TABLE t_salary_detail( username string, month string, salary INT ) ROW format del ...

  5. 用VirtualBox代替VMWare安装Ubuntu系统图文教程总结

    文章目录 为什么使用VirtualBox,而不是VMWare? 图文教程 安装VirtualBox 下载Ubuntu镜像 新建虚拟机 安装Ubuntu系统 总结 为什么使用VirtualBox,而不是 ...

  6. 新鲜出炉高仿网易云音乐 APP

    我的引语 晚上好,我是吴小龙同学,我的公众号「一分钟GitHub」会推荐 GitHub 上好玩的项目,一分钟 get 一个优秀的开源项目,挖掘开源的价值,欢迎关注我. 项目中成长是最快的,如何成长,就 ...

  7. 07JAVA基础面向对象-继承/多态

    一.继承 1.概念 子类的共性 重用现有类并在此基础上进行扩展 public class 子类 extends 父类{} 2.继承中的成员访问 成员变量 成员方法 局部->本类中成员变量-> ...

  8. unserialize3

    0x01序列化与反序列化 序列化:将变量转换为可保存或传输的字符串的过程. 反序列化:在适当的的时候把这个字符串再转化成原来的变量使用. 优点: 存储和传输数据更方便,使程序维护性更高. 函数: se ...

  9. Amaze UI学习笔记——JS学习历程一

    1.自定义事件 (1)一些组件提供了自定义事件,命名方式为{事件名称}.{组件名称}.amui,用户可以查看组件文档了解.使用这些事件,如: $('#myAlert').on('close.alert ...

  10. 消息队列之Kafka——从架构技术重新理解Kafka

    Apache Kafka® 是 一个分布式流处理平台. 这到底意味着什么呢? 我们知道流处理平台有以下三种特性: 可以让你发布和订阅流式的记录.这一方面与消息队列或者企业消息系统类似. 可以储存流式的 ...