前言
作为一个不务正业的芯片前端,总会遇到掉奇奇怪怪的需求,就比如题目这个啊,我写完之后就觉得非常的拗口。那么具体的需要是啥呢?就是比如说有了下面这个excel表:
信号名 | width |
sig0 | 3 |
sig1 | 10 |
sig2 | 14 |
sig3 | 20 |
sig4 | 8 |
要直接做一列生成前面几个信号在整体信号中的取位信息,简单来说就是这样:
信号名 | width | local |
sig0 | 3 | [2:0] |
sig1 | 10 | [12:3] |
sig2 | 14 | [26:13] |
sig3 | 20 | [46:27] |
sig4 | 8 | [54:47] |
并且呢,当前面的信号位宽调整后,后面也要自己跟着动,比如说这样:
信号名 | width | local |
sig0 | 3 | [2:0] |
sig1 | 10 | [12:3] |
sig2 | 111 | [123:13] |
sig3 | 20 | [143:124] |
sig4 | 8 | [151:144] |
emmmm,是不是看起来超集的简单并且有条理了,看起来的确是非常的简单。
解决方法
我试了好多方法一筹莫展啊,这玩意看起来简单实现还挺烦的,所以不得已呢我借助了中间变量,先加两列再说:
这两列的实现就非常简单了,不需要解释。有了这两行之后呢,你看看这加起新的一列不就简单很多了么,直接找好对应的列,一写这不就成了么:
=[C3:D3]
emmmm
就很离谱,为啥我没钱买正版的excel呢?这不是重点,重点是公式为啥这么不智能呢,于是还要上手改。
我查到了TEXT函数可以把数字转成字符,那么怎么把字符拼接呢?这个时候就全凭灵光乍现了~之前写VBA的时候我记得比较清楚,字符串的拼接是用&来做的,我试了下还真的是一样的:
="["&TEXT((C3),"###")&":"&TEXT(D3,"###")&"]"
改成这个样子后可以说非常完美,但是美中不足是,数字0会被忽视不打印,因此呢第一行简化一下:
="["&TEXT((C2),"###")&":"&"0]"
惨兮兮的自己写0吧,反正能用就行呗。
于是乎最后的效果就出现了:
信号名 | width | MSB | LSB | local |
sig0 | 3 | 2 | 0 | [2:0] |
sig1 | 10 | 12 | 3 | [12:3] |
sig2 | 111 | 123 | 13 | [123:13] |
sig3 | 20 | 143 | 124 | [143:124] |
sig4 | 8 | 151 | 144 | [151:144] |
sig5 | 4 | 155 | 152 | [155:152] |
sig6 | 5 | 160 | 156 | [160:156] |
sig7 | 4 | 164 | 161 | [164:161] |
sig8 | 5 | 169 | 165 | [169:165] |
sig9 | 7 | 176 | 170 | [176:170] |
哎,随便你怎么拉怎么加,都是无脑适配的~可以说没有任何问题。那么反过头来一看,比原始需求好像多了两列,那怎么办呢?
我要是甲方可以说是非常满意,甚至想请吃饭!