PyConn的数据结构选择

作为数据结构小白,对于开发新工具PyConn的数据结构选择进行了大量的思想斗争而不得其果,只好从数据结构基础开始这个选择的过程。

数据结构是数据元素和数据元素之间关系的组织形式。

数据结构包含存储结构,逻辑结构,以及对数据的操作。

存储结构分为四种基本形式:

(1)顺序存储方式。数据元素顺序存放,每个存储结点只含一个元素。存储位置反映数据元素间的逻辑关系。存储密度大,但有些操作(如插入、删除)效率较差。

(2)链式存储方式。每个存储结点除包含数据元素信息外还包含一组指针。指针反映数据元素间的逻辑关系。这种方式不要求存储空间连续,便于动态操作(如插入、删除等),但存储空间开销大,且不适用于随机查找。

(3)索引存储方式。除数据元素存储在一地址连续的内存空间外,尚需建立一个索引表,索引表中索引指示存储结点的存储位置,兼有静态和动态特性。

(4)散列存储方式。将关键字散列在连续的有限的地址空间内,并将散列函数的值解释成关键字所在元素的存储地址,这种存储方式称为散列存储。其特点是存取速度快,只能按关键字随机存取,不方便顺序存取。

逻辑结构也分为四种基本形式:

(1)集合

(2)线性结构

(3)树形结构

(4)图形或网状结构。

目前条件下,我们几乎可以不关系内存空间的大小、连续性,只追求查找和其他操作的效率。

一个大致的判断,PyConn的存储结构可以选取 索引存储方式 或者 散列存储方式,或者混合形式;

逻辑结构可以选取 树形结构 或者 图形/网状结构。

简单来看,一种数据结构在语言上可以用结构体(struct)或者类(class)来表示,我们用python,所以用class表示。

PyConn在操作大多在两个层面上:

1. instance数据元素的查找和修改

2. instance之间关系的查找和修改

不妨把这两层看作是两层数据结构,按照之前的预想

第一层是class instance(instance含层次保证唯一性)

value主要包括

a.例化形式(module和param)

b.跟其他instance的connection

c.资源(reg, comb, mem)

存储结构可以选择散列存储

逻辑结构可以无视(元素之间互相不依赖)

基本操作是插入(初始化),查找,修改value(划分导致),删除(删除dft/lp连接)

第二层是class instance_tree(system)

存储结构可以选择链式存储(其实可以看作存的值就是instance的指针,所以这一层可以不关心存储结构)

逻辑结构可以选择树形结构(因为自顶向下的逻辑关系,感觉不需要图或者网形结构)

基本操作是插入(asic代码自顶向下解析),查找,修改value(主要是修改层次即),删除。

亦可以理解为PyConn的数据结构是 存储结构:散列 + 逻辑结构:树形

PyConn的input:

FPGA_partition.txt (类似于iconnect中的hierarchy部分,让我们把auto partition跟PyConn分开吧)

ASIC RTL的gtech网表

ASIC RTL的层次结构和例化形式(看能否用反向connect生成)

PyConn的DB1:

instance_tree asic_system

instance asic_instance1

instance asic_instance2

instance asic_instance3

PyConn的DB2:

instance_tree fpga_system

instance fpga_instance1

instance fpga_instance2

instance fpga_instance3

PyConn的output:

FPGA RTL代码

散列是确定的,即hash,可是

树形结构有这么多种,哪种最适合 -- 最终选择标准是要算得快 -- 而要算什么?

问题转化为

1. 有哪几种树,这些树形的特点是什么,适合什么样的操作?

2. PyConn需要对instance做哪些操作?每种操作分别有多大概率要用到?

时间: 2024-12-26 21:05:24

PyConn的数据结构选择的相关文章

数据结构-选择排序

选择排序 1.选择排序 //堆排序,向下调整子函数 void AdjustDown(int *a, size_t size, size_t root) { size_t parent = root; size_t child = parent * 2 + 1; while (child < size) { //选择孩子节点中较大的节点,与父亲节点交换 if (child + 1 < size&&a[child + 1] > a[child]) { ++child; } i

浅谈数据结构-选择排序

选择排序:每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止. 选择排序正如定义所讲,在数组查询出最小值,然后放在此次循环开始位置(前一次循环已经获取比它更小的值放在前面). 简单选择排序就是单纯的从数组中一次一次循环获取到最小值,放到循环位置.而堆排序正如名字,是从一个堆中选择,然后放在堆的循环开始位置,所以重点就是如何争取获取堆(分组). 一.简单选择排序 1.算法思想 正如图上所示,每次选择最小值,然后放在本次循环的开始位置. 2.代码 //选择排

应用中如何使用适当的数据结构

应用中如何使用适当的数据结构 键查找 Searching for a key 选择适当的数据结构是一件大家都认同,却很少有人会考虑的事.从我的经验来看, 这不仅是因为它很难引起人们的好奇心,更重要的原因是它需要不厌其烦的进行实验和基准测试,这可能会增加很多不必要的负担.让我们来举个例子.我在日常工作中遇到的很多软件操作都是查找一个key然后对其进行操作,要么检查它是否存在, 要么取出与其相关联的值.为了简单起见, 我们把操作限于检查键是否存在. 基于同样的目的,我们同时将key的类型限制为int

mysql选择上一条、下一条数据记录

1.表数据结构 选择mysql记录上一条,下一条sql语句 SELECT * FROM user ORDER BY rank ASC +----+------+---------+ | ID | rank | name | +----+------+---------+ | 1 | 1 | admin1 | | 2 | 2 | admin2 | | 3 | 3 | admin3 | | 4 | 4 | admin4 | | 5 | 5 | admin5 | | 6 | 6 | admin6 |

《编程珠玑》第一部分总结

第一部分主要回顾了一些编程的基础. 第1章介绍了单个问题的历史,由精确的问题陈述及定义寻找解决方案进行程序设计,目前我们考虑的都是简单问题,如果仔细分析这个简单的小问题将会给我们带来巨大的好处,也说明了这本书的主题:认真认真思考分析真实的案例是一件有趣的事,并且很可能在实践中获得收益. 第2章通过三个问题,讲述了研究算法的用处,二分查找法是一个寻找问题的解决方案,强调了算法上的理解如何才能产生简单有效的代码. 第3章讲述了数据结构程序,合适的数据视图构造了程序,描述了各种不同的程序,通过重构内部

Java—集合框架Set

Set接口及其实现类--HashSet Set是元素无序并且不可以重复的集合,被称作集. HashSet-哈希集,是Set的一个重要实现类. Set的使用   HashSet没有像List一样的set()方法来用指定元素替换指定位置的元素,因为Set集合的元素是无序的.同样也不能用访问索引的方式来获取指定位置的元素. Course.java package com.test.collection; /** * 课程类 * @author Administrator * */ public cla

Java(Android)代码的优化变化

[转自e良师益友网]随着Android的发展,Java语言也在不断的发展.从Android发布第一台手机开始注定了Android的不平凡之路,而代码优化却成为了Android切切实实的发展之路.下面看看Java(Android)代码不断发展的在哪些方面进行了优化. 1.降低执行时间 这部分包括:缓存.数据存储优化.算法优化.JNI.逻辑优化.需求优化几种优化方式. (1)缓存 缓存主要包括对象缓存.IO缓存.网络缓存.DB缓存,对象缓存能减少内存的分配,IO缓存减少磁盘的读写次数,网络缓存减少网

性能优化之Java(Android)代码优化

1.降低执行时间这部分包括:缓存.数据存储优化.算法优化.JNI.逻辑优化.需求优化几种优化方式.(1). 缓存缓存主要包括对象缓存.IO缓存.网络缓存.DB缓存,对象缓存能减少内存的分配,IO缓存减少磁盘的读写次数,网络缓存减少网络传输,DB缓存较少Database的访问次数.在内存.文件.数据库.网络的读写速度中,内存都是最优的,且速度数量级差别,所以尽量将需要频繁访问或访问一次消耗较大的数据存储在缓存中. Android中常使用缓存:a.  线程池b.  Android图片缓存,Andro

NOIP 11.01 应试记录

快排代码 void quicksort(int left,int right) { int u,j,t,temp; if(letf>right) return; temp=a[left]; i=left; j=right; while(i!=j) { while(a[j]>=temp && i<j) j--; while(a[i]<=temp && i<j) i++; if(i<j) { t=a[i]; a[i]=a[j]; a[j]=t