def compile(self, module: ll.Module, builder: ll.IRBuilder): inputs = [] for i in range(self.num_inputs): path = self.get_pin(f'in{i}') inputs.append(module.get_global(path)) output = module.get_global(self.get_pin('out')) output_v = ll.Constant(INT_TYPE, 0) if self.kind == 'and': output_v = builder.not_(output_v) for inp in inputs: v = builder.load(inp) if self.kind == 'and': output_v = builder.and_(output_v, v) elif self.kind == 'or': output_v = builder.or_(output_v, v) elif self.kind == 'xor': output_v = builder.xor(output_v, v) if self.negated: output_v = builder.not_(output_v) builder.store(output_v, output)
def compile(self, module: ll.Module, builder: ll.IRBuilder): pin_in = self.get_pin('in') pin_out = self.get_pin('out') pin_in = module.get_global(pin_in) pin_out = module.get_global(pin_out) v = builder.load(pin_in) v = builder.not_(v) builder.store(v, pin_out)
def compile(self, module: ll.Module, builder: ll.IRBuilder): for cname in self._toposort(): cdesc = self.children[cname] cdesc.compile(module, builder) for pin1 in self._conns.get(cname, dict()): for desc2, pin2 in self._conns[cname][pin1]: p1 = self.get_desc(cname).get_pin(pin1) p2 = self.get_desc(desc2).get_pin(pin2) p1 = module.get_global(p1) p2 = module.get_global(p2) v = builder.load(p1) builder.store(v, p2)