Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def tree_reduce(op, vector):
if len(vector) < 1:
raise PyrtlError("Cannot reduce empty vectors")
if len(vector) == 1:
return vector[0]
left = tree_reduce(op, vector[:len(vector) // 2])
right = tree_reduce(op, vector[len(vector) // 2:])
return op(left, right)
'x86_64': '"mulq %q3":"=a"(pl),"=d"(ph):"%0"(t0),"r"(t1):"cc"',
'arm64': '"mul %0, %2, %3\n\tumulh %1, %2, %3":'
'"=&r"(*pl),"=r"(*ph):"r"(t0),"r"(t1):"cc"',
'mips64': '"dmultu %2, %3\n\tmflo %0\n\tmfhi %1":'
'"=r"(*pl),"=r"(*ph):"r"(t0),"r"(t1)',
}
if machine in mulinstr:
write('#define mul128(t0, t1, pl, ph) __asm__({})'.format(mulinstr[machine]))
# declare memories
mems = {net.op_param[1] for net in self.block.logic_subset('m@')}
for key in self._memmap:
if key not in mems:
raise PyrtlError('unrecognized MemBlock in memory_value_map')
if isinstance(key, RomBlock):
raise PyrtlError('RomBlock in memory_value_map')
for mem in mems:
self._declare_mem(write, mem)
# single step function
write('static void sim_run_step(uint64_t inputs[], uint64_t outputs[]) {')
write('uint64_t tmp, carry, tmphi, tmplo;') # temporary variables
# declare wire vectors
for w in self.block.wirevector_set:
self._declare_wv(write, w)
# inputs copied in
inputs = list(self.block.wirevector_subset(Input))
self._inputpos = {} # for each input wire, start and number of elements in input array
self._inputbw = {} # bitwidth of each input wire
ipos = 0
def __ilshift__(self, other):
""" This is an illegal op for Consts. Their value is set in the __init__ function"""
raise PyrtlError(
'ConstWires, such as "%s", should never be assigned to with <<='
% str(self.name))
def __getitem__(self, item): # this is really to make pylint happy
raise PyrtlError("You usually don't want the immediate producer")
dead_end()
continue
next_wire = cur_item.net.args[cur_item.arg_num]
if next_wire not in current_wires:
current_wires.add(next_wire)
checking_stack.append(_FilteringState(next_wire))
else: # We have found the loop!!!!!
loop_info = []
for f_state in reversed(checking_stack):
loop_info.append(f_state)
if f_state.dst_w is next_wire:
break
else:
raise PyrtlError("Shouldn't get here! Couldn't figure out the loop")
return loop_info
raise PyrtlError("Error in detecting loop")
def truncate(self, bitwidth):
""" Generate a new truncated wirevector derived from self.
:return WireVector: Returns a new WireVector equal to
the original WireVector but truncated to the specified bitwidth.
If the bitwidth specified is larger than the bitwidth of self,
then PyrtlError is thrown.
"""
if not isinstance(bitwidth, int):
raise PyrtlError('Can only truncate to an integer number of bits')
if bitwidth > self.bitwidth:
raise PyrtlError('Cannot truncate a wirevector to have more bits than it started with')
return self[:bitwidth]
raise PyrtlError('error, signed integers are not supported in verilog-style constants')
base = 10
if sval[0] in bases:
base = bases[sval[0]]
sval = sval[1:]
sval = sval.replace('_', '')
num = int(sval, base)
except (IndexError, ValueError):
raise PyrtlError('error, string not in verilog style format')
if neg and num:
if (num >> bitwidth-1):
raise PyrtlError('error, insufficient bits for negative number')
num = (1 << bitwidth) - num
if passed_bitwidth and passed_bitwidth != bitwidth:
raise PyrtlError('error, bitwidth parameter of constant does not match'
' the bitwidth infered from the verilog style specification'
' (if bitwidth=None is used, pyrtl will determine the bitwidth from the'
' verilog-style constant specification)')
return ValueBitwidthTuple(num, bitwidth)
:param int or str val: The value for the const wirevector
:return: a wirevector object representing a const wire
Descriptions for all parameters not listed above can be found at
py:method:: WireVector.__init__()
"""
self._validate_bitwidth(bitwidth)
from .helperfuncs import infer_val_and_bitwidth
num, bitwidth = infer_val_and_bitwidth(val, bitwidth)
if num < 0:
raise PyrtlInternalError(
'Const somehow evaluating to negative integer after checks')
if (num >> bitwidth) != 0:
raise PyrtlError(
'error constant "%s" cannot fit in the specified %d bits'
% (str(num), bitwidth))
name = _constIndexer.make_valid_string() + '_' + str(val)
super(Const, self).__init__(bitwidth=bitwidth, name=name, block=block)
# add the member "val" to track the value of the constant
self.val = num
:param integer_val: The integer to take the log base 2 of.
:return: The log base 2 of integer_val, or throw PyRTL error if not power of 2
This function is useful when checking that powers of 2 are provided on inputs to functions.
It throws an error if a negative value is provided or if the value provided is not an even
power of two.
Examples: ::
log2(2) # returns 1
log2(256) # returns 8
addrwidth = log2(size_of_memory) # will fail if size_of_memory is not a power of two
"""
i = integer_val
if not isinstance(i, int):
raise PyrtlError('this function can only take integers')
if i <= 0:
raise PyrtlError('this function can only take positive numbers 1 or greater')
if i & (i-1) != 0:
raise PyrtlError('this function can only take even powers of 2')
return i.bit_length() - 1