# Output:# signal cs0 = (addr( 0 to 1) == B"0");# signal cs00 = cs0 and (addr( 1 to 2) == B"0");# signal cs00111111 = cs00 and (addr( 2 to 8) == B"111111");# signal cs001111110 = cs00111111 and (addr( 8 to 9) == B"0");# signal cs0011111101 = cs001111110 and (addr( 9 to 10) == B"1");# signal cs00111111010 = cs0011111101 and (addr(10 to 11) == B"0");# signal cs001111110100 = cs00111111010 and (addr(11 to 12) == B"0");# signal cs0011111101001 = cs001111110100 and (addr(12 to 13) == B"1");# signal cs00111111010010 = cs0011111101001 and (addr(13 to 14) == B"0");# signal cs00111111010011 = cs0011111101001 and (addr(13 to 14) == B"1");# signal cs001111110101 = cs00111111010 and (addr(11 to 12) == B"1");# signal cs00111111011 = cs0011111101 and (addr(10 to 11) == B"1");# signal cs001111110110 = cs00111111011 and (addr(11 to 12) == B"0");# signal cs001111110111 = cs00111111011 and (addr(11 to 12) == B"1");# signal cs001111111 = cs00111111 and (addr( 8 to 9) == B"1");# signal cs01 = cs0 and (addr( 1 to 2) == B"1");# signal cs1 = (addr( 0 to 1) == B"1");# signal cs10 = cs1 and (addr( 1 to 2) == B"0");from posixpath import commonprefixdef make_signal(p, q): signame = 'cs%s' % p basesig = 'cs%s' % q test = '(addr(%2d to %2d) == B"%s")' % (len(q), len(p), p[len(q):]) if q == '': print 'signal %16s = %15s %s;' % (signame, '', test) else: print 'signal %16s = %15s and %s;' % (signame, basesig, test)def make_chip_selects(s, q): p = commonprefix(s) if len(p) == len(q): for j in '01': p = q + j t = [i for i in s if i.startswith(p)] if t: make_signal(p, q) make_chip_selects(t, p) else: make_signal(p, q) t = [i for i in s if i.startswith(p)] if len(t) > 1: make_chip_selects(t, p)if __name__ == '__main__': s = [ '10xxxxxxxxxxxx', '01xxxxxxxxxxxx', '001111111xxxxx', '001111110111xx', '001111110110xx', '001111110101xx', '00111111010011', '00111111010010'] s = [a.rstrip("x") for a in s] make_chip_selects(s, '')