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. 201771030129-张琳 实验一软件工程准备—<阅读书之后的三个疑问>

    项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE/ 本次作业要求链接 https://www.cnblogs.com/nwnu ...

  2. Jmeter系列(11)- 并发线程组Concurrency Thread Group详解

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html Concurrency Thread ...

  3. Coursera课程笔记----计算导论与C语言基础----Week 10

    C程序中的数组(Week 10) 一维数组 数组的定义 类型 数组名[常量表达式] int sheep[10] 定义数组时,[]内必须为常量表达式 可以用const int 可以在main函数前,#d ...

  4. SAP ME01创建货源清单

    1业务说明 此文档使用函数:ME_DIRECT_INPUT_SOURCE_LIST创建货源清单 2前台实现 事务代码:ME01 输入抬头信息 保存即可 3代码实现 3.1调用函数 定义参数 字段 调用 ...

  5. C语言进阶_goto与void解析

    世间真正温煦的春色,都熨帖者大地,潜伏在深谷. 一.简介 goto与void是两个不常用的关键字,C语言中的Goto关键字传承字汇编语言,使用方法也与汇编语言相同.void是类型关键字,可修饰函数和变 ...

  6. vue-multi-module【多模块集成的vue项目,多项目共用一份配置,可以互相依赖,也可以独立打包部署】

    基于 vue-cli 2 实现,vue 多模块.vue多项目集成工程 Github项目地址 : https://github.com/BothEyes1993/vue-multi-module 目标: ...

  7. 【漫画】互斥锁ReentrantLock不好用?试试读写锁ReadWriteLock

    ReentrantLock完美实现了互斥,完美解决了并发问题.但是却意外发现它对于读多写少的场景效率实在不行.此时ReentrantReadWriteLock来救场了!一种适用于读多写少场景的锁,可以 ...

  8. MySQL 查询当天、本周,本月、上一个月的数据

    mysql查询当天的所有信息: SELECT * FROM 表名 WHERE year(时间字段名)=year(now()) and month(时间字段名) = month(now()) and d ...

  9. .Net Core3.0 WebApi 项目框架搭建 二:API 文档神器 Swagger

    .Net Core3.0 WebApi 项目框架搭建:目录 为什么使用Swagger 随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了:前端渲染.后端分离的形态,而且前端技术和后端技 ...

  10. Redux:store

    Store是一个对象.他有如下职责: 1.存放state 2.对外提供访问state的接口: getState() 3.允许state更新:dispatch(action) 4.注册监听器: subs ...