介绍Simplify如何简化解码逻辑。
 
 
1. 使用
 
Simplify在DecodeLogic中使用,如下:
 
简化从t和dc项中查找的逻辑。
 
其方法签名如下:
其中:
a. minTerms: 卡诺图中的最小项;
b. dcTerms:卡诺图中的无关项;
c. bits:最小项中变量的个数;
 
2. 主要过程
 
Simplify定义如下:
 
主要步骤如下:
1) 从minTerms和dcTerms中获取质项,即在卡诺图中画圈,把最小项和无关项划入圈中,以合并最小项;
2) 从质项中查找必要质项,做出如下区分:
a. 把质项分为必要质项和非必要质项;
b. 把最小项(minTerms)分为必要质项覆盖的最小项和未覆盖的最小项;
c. 从非必要质项中提取出代价最小的能够覆盖未覆盖最小项的质项,并与必要质项合并为cover;
3) cover就是能够覆盖minTerms的最简项的集合;
 
 
3. 获取质项:getPrimeImplicants
 
调用方式如下:
 
把最小项和无关项合在一起进行化简,如卡诺图中把无关项合在一起进行画圈。
 
getPrimeImplicants的实现如下:
 
1) 合并之前,所有的最小项都是质项。即初始情况下,所有的最小项都是质项,互相不包含(cover);
 
 
2) 把所有项分布到一个bits x bits的表中;
 
若bits=4,表格如下:
 
a. 先根据mask中比特位值为1的位的个数,把所有的蕴含项划分为5列;
b. 然后根据value中比特位值为1的位的个数,把所有列划分为5行;
 
由mask的意义可知:
a. 如果mask中1的个数为0,则value中最多可以有4个1;
b. 如果mask中1的个数为1,则value中最多可以有3个1;
所以每一列中,有一些单元格为空,没有蕴含项分布。
 
 
3) 把单元格(i, j)和(i, j+1)中的蕴含项合并之后存入单元格(i+1, j)
 
单元格(i, j+1)中的项与单元格(i, j)中的项相比,mask中1的位数相同,value中1的位数多了一个,即符合Term.similar的初步特征;
 
如果判断出有similar的项,则可以将二者merge。合并生成的新项相较于(i, j+1),value中1的位数减少一个,mask中1的位数增加一个,即应当存入单元格(i+1, j)。
 
 
4) 搜集未被合并的质项
 
 
5) 把所有质项进行排序
 
 
举例如下:
 
也就是说primes中primes(0)“最小”。
primes(0)相较于primes(1),具有这样的倾向:value中的1更少,或者mask中的1更少。
只是倾向,而非绝对。
 
6) 所有最小项都被质项覆盖
 
 
4. 获取必要质项
 
调用方式如下:
从质项中查找必要质项,即含有不被其他任何项包含的子项的质项。
 
getEssentialPrimeImplicants实现如下:
 
1) 获取每一个质项覆盖的最小项
 
 
可以使用如下表格演示:
 
2) 移除可以省略的质项
 
把(p0, p0CoverdMinTerms)与(p1, p1CoveredMinTerms)进行对比,如果p0覆盖的最小项多,并且p0覆盖p1覆盖的所有最小项,则p1不是必要质项。
 
再把(p0, p0CoverdMinTerms)逐个与(p2, p2CoveredMinTerms),(p3, p3CoverdMinTerms)等进行对比。
 
然后是把p1与p2,p3等进行对比。
 
因为比对的方法是:
不存在else处理,所以这里存在一个假设:p0覆盖的最小项比p1的多。
 
这样就依赖于primes.sortWith(_ < _)这个动作,而这个排序动作无法保证这个假设。
所以这里无法保证primeTerms是最简的。
 
3) 获取必要质项覆盖的最小项
 
 
只被一个质项覆盖的最小项,所对应的质项一定是必要质项。但这不是必要质项的全部。
 
4) 把质项分为必要质项和非必要质项两部分
 
 
5) 获取未被必要质项覆盖到的最小项
 
 
6) 判断是否找到全部必要质项
 
a. 如果所有最小项已经全部被覆盖(uncovered.isEmpty),则已经找全;
b. 如果没有找到必要质项,则所有质项都是非必要质项,无需再找;
 
7) 如果只是找到一部分必要质项,而尚有一部分最小项没被覆盖。则在非必要质项中继续查找针对uncovered的必要质项。
 
 
直至6)中的条件为真。
 
可以看到getEssentialPrimeImplicants终止有两种情况:
a. 找到全部必要质项,uncovered为空;
b. 没找到全部必要质项,uncovered不为空。而余下的非必要质项每一个都覆盖2个以上的最小项;
 
 
5. 获取cover
 
如果没有找到全部必要质项,uncovered不为空。则需要从剩余的非必要质项中,选出能够以最小的代价覆盖uncovered的质项。
 
 
getCover实现如下:
 
这里看minTerms也就是uncovered不为空的情况。
 
1) 获取每个最小项对应的蕴含项
 
如下表:
 
每个蕴含项至少覆盖2个最小项;
 
2) 获取能覆盖全部最小项的蕴含项组合
 
执行示例:
 
a. 把最小项t0对应的蕴含项分别放入集合中:cover.head.map(Set(_))
 
之所以用Set,是为了去重。
 
b. 把t1对应的蕴含项分别加入到t0生成的集合中:c0.flatMap(a => c1.map(a + _))
 
c1.map(...)每次都生成一个新的集合,这样生成的集合的数量成指数级增长。最终获取到能覆盖全部最小项的所有蕴含项组合。
 
3) 比较所有蕴含项组合,选择最cheaper的组合使用
 
 
4) cheaper
 
 
简单来说,就是组合中使用的变量最少。
 
6. 确保所有最小项都得以覆盖
 
 
 
 

Rocket - decode - Simplify的更多相关文章

  1. Rocket - decode - 几个问题

    https://mp.weixin.qq.com/s/pMsK_E4mQrm3QXdnp7nDPQ   讨论指令解码部分遗留的几个问题.     1. 最小项与蕴含项之间的关系   参考链接: htt ...

  2. Rocket - decode - SimplifyDC

    https://mp.weixin.qq.com/s/4uWqBRrMVG6FlnBKmw8U-w   介绍SimplifyDC如何简化解码逻辑.     1. 使用   ​​   简化从mint和m ...

  3. Rocket - decode - 最小项与最大项

    https://mp.weixin.qq.com/s/XrBh9Kapj01HdvBi5MkbgA   介绍布尔代数最小项与最大项相关概念,以及Term类的实现.     参考链接: https:// ...

  4. Rocket - decode - Term

    https://mp.weixin.qq.com/s/CbBWdTlc_DESlUzd8KFcSg   介绍Term类各方法的实现.     ​​   1. prime   表示一个项是否是质项,即这 ...

  5. Rocket - decode - 解码单个信号

    https://mp.weixin.qq.com/s/0D_NaeBEZX5LBQRdCz2seQ     介绍解码单个信号逻辑的实现.    1. 单个信号   每个指令对应了一组信号,每个信号对应 ...

  6. Rocket - decode - Inst Decode

    https://mp.weixin.qq.com/s/WvepB3yAzjMbQalO3Z82pQ   介绍RocketChip Instruction解码逻辑的实现.   1. RISC-V   R ...

  7. 64位开源处理器Rocket该人士介绍

    最近大概读一点UCB发布时间Rocket处理器的源代码,的每个文件的源代码的功能有一定的一般理解,Mark一点点. Rocket是一家64bit标量处理器,5第一阶段管道,用途risc-v指令集.综合 ...

  8. (转)64位开源处理器Rocket的源代码简单介绍

    转载地址: http://blog.csdn.net/leishangwen/article/details/46604819 最近大概阅读了一下UCB发布的Rocket处理器的源码,对源代码各个文件 ...

  9. flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方法

    flask+sqlite3+echarts2+ajax数据可视化报错: UnicodeDecodeError: 'utf8' codec can't decode byte 解决方法: 将 py文件和 ...

随机推荐

  1. python学习笔记 Day4

    1.函数返回值分析 li = [1,2,3,4] li2 = [1,2,3,4] def f1(args): args.append(55) li = f1(li) print(li) f1(li2) ...

  2. spring的bean的属性注入

    一.设置注入 设置注入要求: 要求属性在实体类中必须有getter 和setter方法,然后在spring的工厂中就可以使用property标签进行设值注入. 二.构造注入 通过类的构造方法的方式注入 ...

  3. Spring官网阅读 | 总结篇

    接近用了4个多月的时间,完成了整个<Spring官网阅读>系列的文章,本文主要对本系列所有的文章做一个总结,同时也将所有的目录汇总成一篇文章方便各位读者来阅读. 下面这张图是我整个的写作大 ...

  4. 【FreeRTOS学习03】小白都能懂的Task Management 任务管理基本概念介绍

    在FreeRTOS中,线程的术语又可以被称之为任务,或许这样更加合适,本文将介绍任务的创建/删除,任务参数的使用,以及任务优先级: 1 软实时和硬实时 硬实时系统的任务运行正确性与响应时限是紧密相关的 ...

  5. 一看就懂的Ubuntu系统下samba服务器安装配置教程

    文章目录 前言 环境搭建 安装 配置 Examples 1 创建共享(任何人都可以访问) 2 单用户权限(需要密码访问) 添加samba用户 配置参数 3 支持游客访问(单用户拥有管理员权限) 前言 ...

  6. 一文带你了解Spring核心接口Ordered的实现及应用

    前言 最近在看框架的时候,发现了这个接口,在此进行总结,希望能够给大家帮助,同时提升自己. order接口的大体介绍 Spring框架中有这个一个接口,名字叫Ordered,联想我们在数据库中应用的O ...

  7. 【原理探究】女朋友问我ArrayList遍历时删除元素的正确姿势是什么?

    简介 我们在项目开发过程中,经常会有需求需要删除ArrayList中的某个元素,而使用不正确的删除方式,就有可能抛出异常.或者在面试中,会遇到面试官询问遍历时如何正常删除元素.所以在本篇文章中,我们会 ...

  8. activiti工作流入门学习

    工作流一般在OA系统用的比较多,当然,只要有流程审批的地方都会用到,activiti只是开源的工作流中比较流行的一个,还有其他的开源的工作流,这里学习activiti工作流:前面部分是关于activi ...

  9. 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结

    堆和栈的区别 一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap ...

  10. 整理今天js留下的作业(点击换图片换首页背景图)

    <div class="buttons"> <button id="katong">卡通</button>    <b ...