Exemple #1
0
    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)
Exemple #2
0
    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)
Exemple #3
0
    def compile(self, module: ir.Module, builder: ir.IRBuilder,
                symbols: SymbolTable) -> ir.Value:
        uop = self.prefix
        expr = self.expr.compile(module, builder, symbols)

        if uop == '-':
            return builder.neg(expr)

        if uop in ['~', '!']:
            return builder.not_(expr)

        # if uop in ['+', '++', '-', '--', '~', '!', 'alignof', 'sizeof']:
        #     return "({}{})".format(uop, expr)

        # if uop == 'typeof':
        #     return "({}.getClassName())".format(expr)

        WappaException(
            "FATAL", "Unhandled Prefix Operator {}".format(uop), self.tok)

        return uop