https://mp.weixin.qq.com/s/gbR5fuDbE_nUFVxw-p4rsA

 
简单介绍ReduceOthers的实现。
 
 
1. 基本介绍
 
输入一组Bool元素,把其他位置元素逐个相与的结果,作为当前位置的值输出。
 
2. helper
 
helper实现ReduceOthers的核心功能:
 
1) 输入参数
 
x是输入的一组Bool类型的元素。
 
2) 返回值
 
返回一个元组:(Seq[Bool], Bool)
a. Seq[Bool]:每个位置上返回其他位置上元素逐个相与的结果;
b. Bool:全部输入元素相与的结果;
 
3) x.size <= 1
 
 
可以分成两组情况:
a. x.size == 0:返回(true, true)
b. x.size == 1:返回(true, x(0))
 
4) x.size <= 3
 
因为元素个数有限,所以直接生成结果逻辑。
a. 返回元组的第二个元素为x里的所有元素相与的结果:x.reduce(_ && _)
b. x.take(i)取x中从0到i(不包含,exclusive)的元素:
 
 
c. x.drop(i + 1)取x中从i+1(包含,inclusive)开始的元素;
d. 这样x.take(i) ++ x.drop(i + 1)取x中除去i之外的全部元素;
e. 把这些元素逐个相与:(x.take(i) ++ x.drop(i + 1)).reduce(_ && _)
 
5) x.size > 3
 
如果x中元素过多,则需要提升效率。
 
a. x.grouped(2)把x中的元素每2个分成一个小组,若有多余的1个元素,则自成一组;
 
b. (i ^ 1) >= x.size表示自成一组的多余的1个元素
 
 
c. i/2表示当前元素所在的小组的编号;
d. half(i / 2)表示其他小组中所有元素相与的结果;
e. x(i ^ 1)表示当前小组中的另外一个元素;
f. x(i ^ 1) && half(i / 2)表示其他所有元素的相与结果;
 
3. def apply(x: Seq[Bool]): Seq[Bool]
 
使用helper实现ReduceOthers的功能,考虑输入带有常量的情况。
 
所谓常量就是输入是一个已知恒定的值(字面量,lieral),而不是可变的值(variable)。
a. 把输入分成常量和变量:val (literals, variables) = x.partition(_.isLit)
b. 找出值为假的常量:val falses = literals.count(_.litValue == 0)
c. 如果有两个及以上值为假的常量,则所有输出都为假:
 
这里有个Bug,应该是大于等于2:
 
d. 如果只有一个为假的常量
这个值为假的常量所在位置的输出由其他元素相与获得;
其他位置的输出为假;
 
e. 如果没有为假的常量
 
常量不加入相与运算,只需要求出所有变量ReduceOthers的输出。
 
常量元素对应位置的输出为所有变量相与的结果;
变量元素对应位置的输出从helper的输出中逐个取出;
 
4. def apply(x: Seq[(Bool, Bool)])
 
输入参数为:Seq[(Bool, Bool)]
其中:
a. 所有元组的第二个Bool集中在一起进行ReduceOthers运算。
b. 元组的第一个Bool,连接到第二个Bool对应位置ReduceOthers的运算结果;
 
5. 附录
 
 
 

Rocket - util - ReduceOthers的更多相关文章

  1. Rocket - util - Annotations

    https://mp.weixin.qq.com/s/7C8ZmPpwAqFqyKjL9K40Fg   介绍util中定义的注解(Annotations).   ​​   1. Annotation ...

  2. Rocket - util - Timer

    https://mp.weixin.qq.com/s/Z4JJhZ_jL1lqF1nf_orq9A   简单介绍Timer的实现.   ​​   1. 基本功能   实现定时器的功能.   2. Ti ...

  3. Rocket - util - Replacement

    https://mp.weixin.qq.com/s/zCP7wPuxgQ-r94Tr6BV5iw   简单介绍Replacement的实现.   ​​   1. 基本介绍   用于实现Cache替换 ...

  4. Rocket - util - Repeater

    https://mp.weixin.qq.com/s/xyEq3DgYuf2QuNjssv8pkA   简单介绍Repeater的实现.   ​​   1. 基本功能   A Repeater pas ...

  5. Rocket - util - PrefixSum

    https://mp.weixin.qq.com/s/G2vLP-ncoJzSOgxGGEJkfA   简单介绍PrefixSum的实现.   ​​   1. 基本介绍   ​​ 把一个序列从前向后逐 ...

  6. Rocket - util - MultiWidthFifo

    https://mp.weixin.qq.com/s/CUnrpyQN5LRBR5bxC5u86A   简单介绍MultiWidthFifo的实现.   ​​   1. 基本介绍   实现一个输入宽度 ...

  7. Rocket - util - MaskGen

    https://mp.weixin.qq.com/s/_aJqf1cFJDK5RVRBhxTWOw   介绍MaskGen的实现.   ​​   1. 基本介绍   给定总线宽度beatBytes,根 ...

  8. Rocket - util - Misc

    https://mp.weixin.qq.com/s/kf4FvAFye_bRdT49Yow7Hg   简单介绍Misc中各个辅助方法的用途和实现.   ​​   1. ParameterizedBu ...

  9. Rocket - util - LanePositionedQueue

    https://mp.weixin.qq.com/s/yO_9Ec3S5-AosRVLpsBgOg   简单介绍基于通道位置的队列(LanePositionedQueue)的实现.   ​​   1. ...

随机推荐

  1. grep 如何自动标注颜色

    首先 最后一行加入 保存 然后source ~/.bashrc 然后来试一下效果

  2. Ubuntu系统make menuconfig的依赖包ncurses安装

    Linux内核或者u-boot进行make menuconfig的时候,如果系统上没有安装ncurses,就会出现以下报错 *** Unable to find the ncurses librari ...

  3. Linux内核驱动学习(七)应用层直接操作GPIO

    文章目录 简介 原理图 节点 设置为输出 设置为输入 映射关系 debugfs pwm demo 简介 前面通过libgpio的方式介绍了内核空间对GPIO进行操作的接口,其做了较好的封装,同时Lin ...

  4. arangodb安装

    这里仅介绍windows环境下的安装,直接官网下载安装包安装即可.安装完后进入安装目录进行配置. cd ArangoDB\\etc\\arangodb3 打开arangod.conf配置文件,修改以下 ...

  5. 放大镜功能 JS原生写法

    ********** 希望对大家帮助 我会继续努力的 如果有不对的地方请大家帮忙指出****** 1 [JS 代码] <script> var oBox = document.getEle ...

  6. 用python爬了厦门人才网的.net岗位

    为了看看.net的就业行情怎么样,用python爬取了厦门人才网.net岗位的信息,话不多说上代码,python没学多久,如果有什么不妥请指正 import requests from bs4 imp ...

  7. vue 在main.js里使用vue实例

    可以用 Vue.prototype 比如 Vue.prototype.$indicator.close(); 关闭正在加载的动画

  8. es6中class类的全方面理解

    传统的javascript中只有对象,没有类的概念.它是基于原型的面向对象语言.原型对象特点就是将自身的属性共享给新对象.这样的写法相对于其它传统面向对象语言来讲,很有一种独树一帜的感脚!非常容易让人 ...

  9. 一文解读C# 动态拦截第三方进程中的方法函数(外挂必备)

    一.前言 由于项目需要,最近研究了一下跨进程通讯改写第三方程序中的方法(运行中),把自己程序中的目标方法直接覆盖第三方程序中的方法函数:一直没有头绪,通过搜索引擎找了一大堆解决方案,资料甚是稀少,最后 ...

  10. Java—线程的生命周期及线程控制方法详解

    线程生命周期5种状态 介绍   线程的生命周期经过新建(New).就绪(Runnable).运行(Running).阻塞(Bolocked)和死亡(Dead) 状态转换图 新建(New)   程序使用 ...