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. sprign mvc 解决中文乱码问题

    解决get乱码问题 解决get请求的乱码需要在tomcat中解决,需要找到tomcat 的conf/server.xml: 解决post乱码问题 解决post乱码问题需要在spring 的主配置文件总 ...

  2. 10大Web漏洞扫描工具

    Web scan tool 推荐10大Web漏洞扫描程序 Nikto 这是一个开源的Web服务器扫描程序,它可以对Web服务器的多种项目(包括3500个潜在的危险文件/CGI,以及超过900个服务器版 ...

  3. python--封装Redis

    Redis封装 import redis class MyRedis():    def __init__(self,ip,password,port=6379,db=1):#构造函数         ...

  4. Python格式化字符串(格式化输出)

    熟悉C语言 printf() 函数的读者能够轻而易举学会 Python print() 函数,它们是非常类似的. print() 函数使用以%开头的转换说明符对各种类型的数据进行格式化输出,具体请看下 ...

  5. React-Router4 按需加载的4种实现

    其实几种实现都是近似的,但具体上不太一样,其中有些不需要用到bundle-loader 第一种:ReactTraining/react-router 介绍的基于 webpack, babel-plug ...

  6. java 面向对象面试题,问答题,构造方法,抽象类,继承,多态,接口,异常总结;

    一,构造方法的特点 面向对象的思想是如何在java展现的呢? 就是通过类和对象 类是一组相关的属性和行为的集合.是一个抽象的概念. 对象是该类事物的具体表现形式.具体存在的个体. 一.抽象类的抽象方法 ...

  7. poj1149 经典建模

    http://wenku.baidu.com/view/0ad00abec77da26925c5b01c.html 以上内容均为转载 #include<queue> #include< ...

  8. BZOJ1080 暴力+位移运算符的用法

    1080: [SCOI2008]劣质编码 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 337  Solved: 148[Submit][Status ...

  9. 【Java_SSM】(三)maven中的配置文件setting的配置

    这篇博文我们介绍两方面:如何修改setting.xml文件及相应配置(本文maven版本为3.5.0) (1)首先打开maven文件目录--conf,会看见如下目录 (2)复制setting.xml文 ...

  10. python基础:list与string互转

    数据清洗必备技能 https://www.cnblogs.com/yaner2018/p/11162630.html