Ejemplo n.º 1
0
 def __init__(self, name, inputs, outputs, parallel=False):
     self.name = name
     self.inputs = inputs
     self.outputs = outputs
     self.commands = collections.OrderedDict()
     self.zero = variables(name='FALSE')
     self.one = variables(name='TRUE')
     self.parallel = parallel
Ejemplo n.º 2
0
    def __init__(self,
                 name,
                 inputs,
                 outputs,
                 nb,
                 randomize_temps=2,
                 carry_out=True,
                 carry_in=False):
        '''
        Adds x1 and x2 where the bit length of both is nb
        Inputs will be structured as [cin x1 x2] - size(2*nb)+1
        Outputs - size (b+1)
        '''
        mini_mod.__init__(self, name, inputs, outputs)
        self.randomize_temps = randomize_temps
        self.nb = nb
        if not carry_in:
            assert(self.nb * 2 == len(inputs)), "You need to have " + \
                str(2 * self.nb) + " inputs not " + str(len(self.inputs))
        else:
            assert(self.nb * 2 + 1 == len(inputs)), "You need to have " + \
                str(2 * self.nb + 1) + " inputs not " + str(len(self.inputs))

        self.carry_list = [
            variables(self.name + '_carry_' + str(i),
                      randomize_name=self.randomize_temps)
            for i in range(self.nb + 1)
        ]

        # TODO - Fill with zeros
        assert(len(self.outputs) ==
               self.nb + 1), "Output bitwidth should be length of adder: " + \
            str(self.nb + 1) + " not " + str(len(self.outputs))
        self.create(carry_out=carry_out, carry_in=carry_in)
Ejemplo n.º 3
0
    def create(self, carry):
        if carry:
            cin = self.inputs[0]

        x = self.inputs[carry]
        y = self.inputs[carry + 1]
        temp1 = variables(self.name + '_tmp1',
                          randomize_name=self.randomize_temps)
        temp2 = variables(self.name + '_tmp2',
                          randomize_name=self.randomize_temps)
        temp3 = variables(self.name + '_tmp3',
                          randomize_name=self.randomize_temps)
        self.add(bi_assign(ass_type='xor', lhs=[x, y], rhs=temp1))

        if carry:
            self.add(
                bi_assign(ass_type='xor',
                          lhs=[temp1, cin],
                          rhs=self.outputs[0]))
        else:
            self.add(
                mono_assign(ass_type='alias', lhs=[temp1],
                            rhs=self.outputs[0]))

        self.add(bi_assign(ass_type='and', lhs=[x, y], rhs=temp2))

        if carry:
            self.add(bi_assign(ass_type='and', lhs=[cin, temp1], rhs=temp3))
            self.add(
                bi_assign(ass_type='or',
                          lhs=[temp3, temp2],
                          rhs=self.outputs[1]))
        else:
            self.add(
                mono_assign(ass_type='alias', lhs=[temp2],
                            rhs=self.outputs[1]))
Ejemplo n.º 4
0
    def __init__(self,
                 name,
                 inputs,
                 outputs,
                 nb,
                 randomize_temps=2,
                 carry_out=True):
        '''
        Adds x1 and x2 where the bit length of both is nb
        Inputs will be structured as [cin x1 x2] - size(2*nb)+1
        Outputs - size (b+1)
        '''
        self.x = inputs[0]
        self.y = inputs[1]
        mini_mod.__init__(self, name, self.x + self.y, outputs)

        self.len1 = len(self.x)
        self.len2 = len(self.y)

        if self.len1 < self.len2:
            tmp = copy.deepcopy(self.x)
            self.x = copy.deepcopy(self.y)
            self.y = tmp

        self.randomize_temps = randomize_temps
        self.nb = nb
        assert(self.nb == self.len1), "You need to have " + \
            str(self.nb) + " inputs not " + str(len(self.x))

        self.carry_list = [
            variables(self.name + '_carry_' + str(i),
                      randomize_name=self.randomize_temps)
            for i in range(self.nb + 1)
        ]

        assert(len(self.outputs) ==
               self.nb + 1), "Output bitwidth should be length of adder: " + \
            str(self.nb + 1) + " not " + str(len(self.outputs))
        self.create(carry_out=carry_out)
Ejemplo n.º 5
0
            if idx < len(self.plaintext) and int(self.plaintext[idx]) == 1:
                self.add(
                    tri_assign(ass_type='mux',
                               lhs=[self.inputs[idx], temp1[idx], self.zero],
                               rhs=temp2[idx]))
            else:
                self.add(
                    tri_assign(ass_type='mux',
                               lhs=[self.inputs[idx], self.one, temp1[idx]],
                               rhs=temp2[idx]))
            if idx < len(self.inputs) - 1:
                self.add(
                    mono_assign(ass_type='alias',
                                lhs=[temp2[idx]],
                                rhs=temp1[idx + 1]))
            else:
                self.add(
                    mono_assign(ass_type='alias',
                                lhs=[temp2[idx]],
                                rhs=rel_out))


if __name__ == '__main__':
    x = variables('x')
    y = variables('y')
    cin = variables('cin')
    s = variables('sum')
    c = variables('carry')
    b2_adder = oneb_adder('2b_adder', [cin, x, y], [s, c], 1)
    print(b2_adder)
Ejemplo n.º 6
0
            for i in tqdm(range(num_coms)):
                proc_arr.append(
                    Process(target=local_str, args=(output, i, vals[i])))
                proc_arr[i].start()
            for i in tqdm(range(num_coms)):
                proc_arr[i].join()
            results = [output.get() for p in proc_arr]
            for idx, val in enumerate(results):
                tgt_list[val[0]] = str(val[1])
        else:
            tgt_list = [str(x) for x in vals]
        return '\n'.join(tgt_list)


if __name__ == '__main__':
    a = variables('a')
    b = variables('b')
    c = variables('c')
    d = variables('d')
    t1 = mono_assign(ass_type='not', lhs=[a], rhs=b)
    print(t1)
    t2 = mono_assign(ass_type='alias', lhs=[b], rhs=d)
    print(t2)
    t3 = bi_assign(ass_type='or', lhs=[d, c], rhs=b)
    print(t3)

    print("MODULE below")
    t = mini_mod('addition', [a, c], b)
    t.add(t1)
    t.add(t2)
    t.add(t3)