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. mybatis与hibernate运行流程比较

    hibernate长时间没用,感觉生疏了,正好借这篇文章整合下知识,顺便复习比较下两种框架. 概述: Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己 ...

  2. Code::Blocks20.03 编译报错

    Code::Blocks最近出了新版20.03,进入官网选择下载了附带MinGW版的安装包后,编译HelloWorld就报错(CB一直以来都有问题,新版还是这样...) 主要有两个问题: ld.exe ...

  3. OpenWrt R2020.3.19 反追踪 抗污染 加速 PSW 无缝集成 UnPnP NAS

    固件说明 基于Lede OpenWrt R2020.3.19版本Lienol Feed及若干自行维护的软件包 结合家庭x86软路由场景需要定制 按照家庭应用场景对固件及软件进行测试,通过后发布 设计目 ...

  4. 【Java基础总结】Java基础语法篇(上)

    Java基础语法 思维导图 一.Java语言介绍 1.Java应用平台 JavaSE(Java Platform Standard Edition):开发普通桌面和商务应用程序,是另外两类的基础 Ja ...

  5. 设计模式之GOF23装饰模式

    装饰模式decorator 作用: -动态的为一个对象增加新功能 -装饰模式是一种用于代替继承的技术,无需通过增加子类就能扩展对象的新功能,适用对象的组合关系代替继承关系,更加灵活,同时避免类型体系的 ...

  6. [hdu1079]简单博弈

    题意:两个人玩游戏,给定一个日期,他们轮流选择日期,可以选择当前日期的下一天,如果下一个月也有这一天的话则也可以选择下一个月的这一天.超过某一日期的人输. 思路:以天为状态,则一共有300多万个左右的 ...

  7. Apache Poi实现excel解析

    一.说明 1.本文通过使用 poi 工具解析 excel 表格数据,实现导入导出 2.excel目前有两种格式 2003版本的 excel.xls 与 2007版本的 excel.xlsx ,注意两种 ...

  8. java 版本比较

    public class version { public static int compareVersion(String version1, String version2) throws Exc ...

  9. Antd 表格数据分页展示

    分页组件代码 render(){ const {total,size,currenPage} = this.state // 参数分别为数据总条数.每页数据条数.当前页页码 return ( // 渲 ...

  10. Linux相关命令、虚拟机网络配置

    虚拟机联网 Linux命令 1.查找 #查找django进程,不包括grep自建的 ps -ef |grep django | grep -v grep # find 查找home目录下的name.t ...