sncircuit开发备忘:网络合并

在 NetlistManagerClass 中原本有一个方法叫做 updateAllNetlistIndexTo(),它起初的含义是将第一网络节点中所有的成员,从第一网络节点中删除、并且追加到第二网络节点中,然后第一网络节点便成为了“荒废节点”,可以删除掉了。

这个方法存在着一些问题。首先是它的名称今天看来已经不再准确,更准确的名称应该是 merge,完成的功能还是一样的:将网络节点a和网络节点b中的所有成员,都迁移到a或b网络节点中,然后将荒废掉的网络节点剔除掉。

其次,对于merge(netlist a, netlist b),究竟是将谁的内容迁移到另外一个网络节点中呢?昨天我纠结了很久,后来想明白了:无论从a到b,还是从b到a,实际上都是一样的,因而完全没有必要纠结要不要为这个方法增加第三个参数指明保留谁。

而今天重构这块代码的时候,又有了更为“智能”的一个方案:既然无论怎样的方向对于合并都没有影响,那么就应该选择成员最少的网络节点进行“搬家”操作,这样效率会更高,因而在merge()内部进行判断,找到a和b中迁移成本低的进行迁移。

额外的,在完成上述方法重构时发现,除了在 PlacementManagerClass 中会调用netlistManager->merge()方法外,在NetlistManagerClass中也会调用netlistManager->merge()方法,并且后者的调用是“迂回到footpin中”进行调用,后者的“迂回”导致代码逻辑十分难以理解,所以将迂回的调用删除了,如此就简化到只要在PlacementManagerClass和NetlistManagerClass两个类中的两个位置上调用merge(),如此代码相对比较容易理解。

即便做到了上面说的“只在两个地方调用”,实际上还是有些“繁琐”的,还是业务逻辑上的繁琐与不恰当。这一点上现在脑子有些乱,所以先写下这篇备忘,将相关工作记录一下。有时间会再推敲如何继续合并代码,争取只在一个地方、一个逻辑内,完成“网络节点的合并”。

每天学习一些新的知识,尽可能保持自己的学习动力。

Related Posts

仿真软件开发进展

Day: 44, SLOC: 6182。 前阵子将仿真软件的基本开发环境搭建起来、勾勒了个整体的模型结构,并且先有的没的将符号绘制、图像渲染、参数调整、计算输出……都草草实现了一遍,绝大多数都是以快速成型、不确保正确为原则开拓的代码基底。 这套开发环境的构建原则是“尽量轻巧”,因而甚至连IDE工具、CMake都没有引入,纯粹使用裸代码撰写,虽然过程痛苦,换来的却是十分的轻便,而且每一行代码都是纯手写,代码敲得十分过瘾。 上面的快乐时光结束之后,就是实打实的撰写每一个具体方法,再不能天马行空、一日百行。每天代码增长大约只有几十行。好在我对模块拆分的很细,基本上每一天都能有个小小的新功能被实现出来。 今天完成的是AC电源的引入,现在终于可以看到一张“时域动画”,效果比之前每天看到的“直流稳态”要灵动一些。 接下来要完成的是电容的引入,这是一个比较重要的、也是需要用到更多核心计算机制的IC,一旦完成了电容的引入,就可以进行一些基本电路的仿真了。 当然,电容的引入并不是1、2天就能完成的事情,所以这期间还会找一些相对容易的功能也一起实现。例如:对已经绘制了的线段、IC进行删除、移动。这样以上普通功能和“难点功能”,就共同构成了本周要进行的开发需求。

Simple Nano Circuit 开发日记(32)

这个软件截至昨天,应该当是一个小的阶段完成——可以初步实现直流电源、电阻构成的电路中各个网络节点的电压求解。起初觉得神秘,做过一遍发现背后的数学原理十分简单,只需要根据电路创建线性方程组,然后求解即可。 下一阶段知识难度估计会大幅度提升,为了迎接下一阶段的挑战,我想还是应该先把当前的工作重新整理、封装,确保现在的代码稳固。因而今天开始做代码的收敛工作。 首先是将之前遗留的若干问题要逐一解决掉,其中既有bug,也有功能的缺失。今天主要完成了以下工作: 1、线性方程组构建中存在一个缺陷,引发了在开路时的电压计算错误,这是方程组中的节点方程构建时,没有考虑到悬空引脚导致的; 2、对代码中若干冗余的方法进行清理; 3、对代码中若干传值的地方进行调整,改成传递引用; 除此之外,还有一些功能上的缺失也要在接下来几天逐一完成: 1、对已放置的IC进行删除、移动等操作; 2、对已放置的IC进行选取,通过弹窗对它们的属性值进行调整。 如上工作全部完成之后,便可以将“交流电源”引入进来,从而产生“时间”的概念,为后续增加非线性元件打下初步基础。 Update 2024.12.28 Day: 33 SLOC: 5012 下午到了家乐福,晚上吃的牛肉面。吃牛肉面之前的一段时间: 1、完成了弹窗修改 电阻 和 直流电源电压 的功能; 2、完成了这个弹窗机制的通用化,也就是说所有的IC,都从基类定义是否可以弹窗,如果可以弹窗,就在IC自己的类内实现弹窗风格和窗口内容设置; 然后下楼吃牛肉面,去的路上想明白了线路中的电流是怎么计算的,没有偷懒的途径,必须对线段进行分割,才能实现电流的分段计算。所以吃完牛肉面回来,开始着手进行线路分割操作。 分割线路的整体思想很简单:落PIN时,判断落PIN是否压中了线段,如果压中线段则对已压中的线段按PIN进行切割;画线时,则是判断线段是否穿越了PINs,如果穿越了PINs,就一次找到每一个PIN同样以PIN为分割点、对线段进行分割。 完成这个功能之后,又进行了一下“清理电路中冗余线段”的功能实现。 1、如果某线段两端有任意段悬空,则将这条线段标记为冗余线段,完成一次检测之后,将所有检测到的冗余线段删除掉(注意此时还要删除连带的可能的冗余网络节点、冗余网络节点存储器等)。…

Simple Nano Circuit 开发日记(30)

Day: 30, SLOC: 4614。 ​最近几天小仿真软件写的有些怠慢,代码膨胀比较厉害。好在终于将主要想法实现了出来,接下来将用2-3天填补遗留的若干缺陷、再花上一周左右做一做代码收敛和文档补全。之后便可以继续下一阶段的开发了。接下来将完成交流电源,再把电感和电容加进来。功能开发的脉络虽然清晰,但实际上这对我而言还是非常有挑战的:当电路只有电阻时,仿真求解只需用到线性代数,可一旦引入了电容和电感,将会用到微分的知识,期望用到的知识点不会太多、太难。 Day: 31, SLOC: 4635。 今天代码与昨天比起来,增加的并不多,但实际上也是做了一些工作的,因为主要是对原有代码进行修缮,所以单纯代码行数上看不出来什么。但借助 git diff 可以看出来,今天也是进行了200多行代码的调整。 主要是解决了此前遗留的奇异矩阵求解问题。 当矩阵是奇异矩阵时,程序会尝试去求解一个元,完成这一个元的求解之后,再次判定矩阵是否是奇异矩阵:如果依然是,则放弃此次求解;如果已经不再是奇异矩阵,就进行求解。 上面这个是之前的思路,然而上面这个思路其实是存在问题的,正确的做法是:如果奇异矩阵在完成了一次解奇异之后,依然是奇异矩阵,可以再次尝试解奇异:如此反复解无可解才认为矩阵无解。若是经过了多次解奇异之后满秩了,那么就可以求解了。 从以上错误的做法到正确的做法,就是今天主要完成的工作。 除此之外还做了一些其他的调整:为 Pin 引脚增加了一些属性,这样在进行相关的运算时就不用再通过引脚找到它的 IC 再去做 IC 判定,引脚在创建时就已经将 IC 信息记录下来,用的时候直接询问就可以了。 同时,引脚不仅记录着…