def cnum(c, args): """ usage: (cnum, <name>, <number of bits>, <value>) defines a constant number """ name, nbits, val = deparen(args[0]), deparen(args[1]), deparen(args[2]) ans = ['list', *binrep(val, nbits)] c.variables[name] = ans return ans
def defnum(c, args): """ usage: (defnum, <name>, <number of bits>) to access the number: (num <name>) """ name, nbits = deparen(args[0]), deparen(args[1]) ans = ['list', *[c.junkvar() for i in range(nbits)]] c.variables[name] = ans return ans
def exactly_one(c, args): params = [deparen(arg) for arg in args] if len(params) == 0: return c.F if len(params) == 1: return params[0] else: hlf = len(params) // 2 return [ '|', ['&', ['e1', *params[:hlf]], ['~', ['|', *params[hlf:]]]], ['&', ['e1', *params[hlf:]], ['~', ['|', *params[:hlf]]]] ]
def mac_at(c, args): return at(deparen(args[0]), [deparen(arg) for arg in args[1:]])
def slice_macro(c, args): lst = c.expr_tree(args[0]) i = deparen(args[1]) j = deparen(args[2]) return lst[i + 1:j + 1]
def index(c, args): lst = c.expr_tree(args[0]) i = deparen(args[1]) return lst[i + 1]
def num(c, args): return c.variables[deparen(args[0])]