仿真电路46、47、48(SLOC: 6354)

前几天感冒了,天昏地暗实在坚持不住,没有写开发日志,但是每天依然坚持写了几行代码。 主要完成的是将电容IC引入到当前的仿真体系中来。实际上在日志45中已经将它引入进来了,但是那个时候只是“初步引入”,对于它的的电压、电流的计算是错误的,所以这几天主要是将电容的电压、电流都逐步调整正确了。 电压网络的求解其实改动并不大,因为电容本身的阻抗计算与电阻是相似的,所以对于电压网络而言,任何一个电容、就和任何一个电阻没有差别。如果不考虑电容的初始电压,那么电容就是电阻。 电容本身的初始电压是唯一的区别,因而在构建矩阵时将其初始电压也当作一个超级电源考虑就可以了。 如上完成电压网络求解之后,接下来求解电流。 电容器的电流需要用自身的历史电压做“微分”完成计算。而在离散的仿真环境中,这个“微分”是利用“差分”近似代替出来的。在使用差分近似代替微分运算时,有2种常用的替代方法,分别是题型近似法、后向欧拉法。这两种统称为“数值计算”的计算方式,都可以完成电容电流的计算。 两种数值计算方法各有利弊,不同的仿真参数下,两种方案的选择不同。好在它们的实现都很简单,可以全部实现出来,然后选择使用。但是我还没有做梯形近似,只先用后向欧拉法完成了电流的计算。 虽然现在实现的IC还非常少,但是已经可以构建出非常简单、基础的电路了,所以接下来将完成以下功能的开发:1、电流移动动画;2、示波器;3、文件存取;4、物理单刀开关IC。

仿真软件开发进展

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

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