https://mp.weixin.qq.com/s/qqL2XWqAhVcnGSxs6kxhLg

 
介绍IdRange的实现。
 
 
1. 基本定义
 
A non-empty half-open range; [start, end)
 
非空,半闭合区间。
 
限定条件如下:
a. start >= 0;
b. start <= end;
 
2. compare
 
比较方法。用于排序。
 
3. overlaps
 
判断是否重叠。
 
4. contains
 
this contains x,x的区间完全处在this的区间范围内。
 
电路生成器:
a. 如果this.size == 0,那么this不可能包含x;
b. 如果this.size == 1,那么只需要判断x是否等于start即可;
c. 把this分成两部分进行比较:高位一直不变的部分和低位变化的部分。
首先,this的有效部分即从start到end-1的过程中,高位始终保持不变的位,与x相应的高位进行比较;
其次,低位变化的位数进行比较,即:LowPartOf(start) <= LowPartOf(x) <= LowPartOf(end-1);
其中:
LowPartOf(start) = start & uncommonMask;
LowPartOf(end-1) = (end-1) & uncommonMask;
LowPartOf(x) = uncommonBits,其计算使用位截取;
 
PS. 这里有一个有意思的地方:(x >> smallestCommonBit) === UInt(start >> smallestCommonBit)
因为x和start的类型不同,所以这里的两个移位符号并不是同一个方法。
虽然在构建时,第一个移位和第二个移位都会执行,但第一个移位方法只是添加一个针对x的移位命令,用于构建一个移位逻辑,真正的移位动作发生在硬件中。而第二个针对start的移位方法,是切切实实直接执行的移位动作,当时就发生了移位(在软件中)。
 
5. shift
 
区间平移。
 
6. size
 
区间包含整数的个数。
 
7. isEmpty
 
区间是否为空。
 
8. range
 
返回一个Range对象。
 
9. 伴生对象
 
检查IdRange序列s中的区间是否存在重叠。
 
10. 附录
 
IdRange:
// A non-empty half-open range; [start, end)
case class IdRange(start: Int, end: Int) extends Ordered[IdRange]
{
require (start >= 0, s"Ids cannot be negative, but got: $start.")
require (start <= end, "Id ranges cannot be negative.")
 
def compare(x: IdRange) = {
val primary = (this.start - x.start).signum
val secondary = (x.end - this.end).signum
if (primary != 0) primary else secondary
}
 
def overlaps(x: IdRange) = start < x.end && x.start < end
def contains(x: IdRange) = start <= x.start && x.end <= end
 
def contains(x: Int) = start <= x && x < end
def contains(x: UInt) =
if (size == 0) {
Bool(false)
} else if (size == 1) { // simple comparison
x === UInt(start)
} else {
// find index of largest different bit
val largestDeltaBit = log2Floor(start ^ (end-1))
val smallestCommonBit = largestDeltaBit + 1 // may not exist in x
val uncommonMask = (1 << smallestCommonBit) - 1
val uncommonBits = (x | UInt(0, width=smallestCommonBit))(largestDeltaBit, 0)
// the prefix must match exactly (note: may shift ALL bits away)
(x >> smallestCommonBit) === UInt(start >> smallestCommonBit) &&
// firrtl constant prop range analysis can eliminate these two:
UInt(start & uncommonMask) <= uncommonBits &&
uncommonBits <= UInt((end-1) & uncommonMask)
}
 
def shift(x: Int) = IdRange(start+x, end+x)
def size = end - start
def isEmpty = end == start
 
def range = start until end
}
 
object IdRange
{
def overlaps(s: Seq[IdRange]): Option[(IdRange, IdRange)] = if (s.isEmpty) None else {
val ranges = s.sorted
(ranges.tail zip ranges.init) find { case (a, b) => a overlaps b }
}
}
 
 

Rocket - diplomacy - IdRange的更多相关文章

  1. Rocket - diplomacy - LazyModule的组织方式

    https://mp.weixin.qq.com/s/vaDUekxkFkOJLmzg5jCngw 简单介绍LazyModule/LazyModuleImp的组织方式. 1. LazyModule L ...

  2. Rocket - diplomacy - LazyModule的实例化(补)

    https://mp.weixin.qq.com/s/rgCRorjPYyyD6i7moIzbZg   介绍LazyModule和Node构造方法的执行过程,即实例化过程.     1. NullIn ...

  3. Rocket - diplomacy - LazyModule的实例化

    https://mp.weixin.qq.com/s/9PsBt4_4qHx4i6C5XtuiUw   介绍LazyModule和Node构造方法的执行过程,即实例化过程.     1. NullIn ...

  4. Rocket - diplomacy - LazyModule

    https://mp.weixin.qq.com/s/FBU8fE4u9-UK6mRGQOlvbQ   介绍LazyModule的实现.     ​​   1. children   LazyModu ...

  5. Rocket - diplomacy - ValName

    https://mp.weixin.qq.com/s/so-2x5KLfYF0IMCCqNThwQ   简单调试ValName实现:   1. 使用     ​​   Desugar之后如下: ​​ ...

  6. Rocket - diplomacy - NodeHandle相关类

    https://mp.weixin.qq.com/s/GWL41P1G1BXm2sTeLmckdA   介绍NodeHandle相关的类.     ​​   1. NoHandle   顶层类(tra ...

  7. Rocket - diplomacy - DUEB参数模型的设计

    https://mp.weixin.qq.com/s/9PEEpe1pkQDN9RWpOGSUCQ   介绍DUEB参数模型的设计,不包含实现(实现对设计做了简化).     1. DUEB   di ...

  8. Rocket - diplomacy - 模块结构信息

    https://mp.weixin.qq.com/s/cTRxXwWNEeb4-XX_t4bRcg   讨论模块结构信息的来源及使用方式.     ​​   1. diplomacy   diplom ...

  9. Rocket - diplomacy - misaligned

    https://mp.weixin.qq.com/s/poCJBcx45clXHm6Uuv8M6w 介绍AddressSet.misaligned的实现.之前介绍的比较概括,也有偏差.这里根据实际执行 ...

随机推荐

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

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

  2. Java并发编程实战 04死锁了怎么办?

    Java并发编程文章系列 Java并发编程实战 01并发编程的Bug源头 Java并发编程实战 02Java如何解决可见性和有序性问题 Java并发编程实战 03互斥锁 解决原子性问题 前提 在第三篇 ...

  3. Git上传文件、文件夹到github

    上传一个文件: $ git add test.txt 上传多个文件: $ git add test.txt demo.txt 同理: 上传一个文件夹: $ git add learngit 上传多个文 ...

  4. 修改托管dll文件

    众所周知,托管的dll是可以反编译且可以修改的. 可以用ildasm.exe导出IL文件,修改IL文件后,用ilasm编译成DLL 用ildasm.exe导出IL文件 1.获得ildasm.exe  ...

  5. Python 简明教程 --- 1,搭建Python 环境

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 人生苦短,我用Python. -- 龟叔T恤 Python 是一门解释型语言,所以要想运行Pytho ...

  6. 理解css属性的继承和覆盖

    首先,我们梳理一下哪些属性会被继承 文本 color 颜色,a元素除外 direction 方向 font 字体 font-family 字体系列 font-style 字体风格 font-size ...

  7. 【雕爷学编程】Arduino动手做(49)---有源蜂鸣器模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备 ...

  8. 使用QQ同步助手备份同步手机数据

    QQ同步助手官网:https://pim.qq.com/ QQ同步助手,由腾讯精心打造的云端备份工具.能实现手机之间传输文件,并备份文件.照片.视频.联系人.短信.通讯记录.应用程序到云端的换手机必备 ...

  9. Kappa(cappa)系数只需要看这一篇就够了,算法到python实现

    1 定义 百度百科的定义: 它是通过把所有地表真实分类中的像元总数(N)乘以混淆矩阵对角线(Xkk)的和,再减去某一类地表真实像元总数与被误分成该类像元总数之积对所有类别求和的结果,再除以总像元数的平 ...

  10. MCP3421使用详解

    0 摘要 因某项目需要,需要采集微弱的电压信号,且对电压精度要求较高,于是选中MCP3421这款18 bit 高精度IIC AD转换芯片.本文将结合MCP3421的手册,对该芯片的使用进行详细解释,并 ...