Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def _extend_with_bit(self, bitwidth, extbit):
numext = bitwidth - self.bitwidth
if numext == 0:
return self
elif numext < 0:
raise PyrtlError(
'Neither zero_extended nor sign_extended can'
' reduce the number of bits')
else:
from .corecircuits import concat
if isinstance(extbit, int):
extbit = Const(extbit, bitwidth=1)
extvector = WireVector(bitwidth=numext)
net = LogicNet(
op='s',
op_param=(0,)*numext,
args=(extbit,),
dests=(extvector,))
working_block().add_net(net)
return concat(extvector, self)
def _build_read_port(self, addr):
if self.max_read_ports is not None:
self.read_ports += 1
if self.read_ports > self.max_read_ports:
raise PyrtlError('maximum number of read ports (%d) exceeded' % self.max_read_ports)
data = WireVector(bitwidth=self.bitwidth)
readport_net = LogicNet(
op='m',
op_param=(self.id, self),
args=(addr,),
dests=(data,))
working_block().add_net(readport_net)
self.readport_nets.append(readport_net)
return data
def _build(self, other):
# Actually create and add wirevector to logic block
# This might be called immediately from ilshift, or delayed from conditional assignment
net = LogicNet(
op='w',
op_param=None,
args=(other,),
dests=(self,))
working_block().add_net(net)
def _build(self, addr, data, enable):
""" Builds a write port. """
if self.max_write_ports is not None:
self.write_ports += 1
if self.write_ports > self.max_write_ports:
raise PyrtlError('maximum number of write ports (%d) exceeded' %
self.max_write_ports)
writeport_net = LogicNet(
op='@',
op_param=(self.id, self),
args=(addr, data, enable),
dests=tuple())
working_block().add_net(writeport_net)
self.writeport_nets.append(writeport_net)
def __getitem__(self, item):
""" Grabs a subset of the wires
:return Wirevector: a result wire for the operation
"""
if self.bitwidth is None:
raise PyrtlError('You cannot get a subset of a wire with no bitwidth')
allindex = range(self.bitwidth)
if isinstance(item, int):
selectednums = (allindex[item], ) # this method handles negative numbers correctly
else: # slice
selectednums = tuple(allindex[item])
if not selectednums:
raise PyrtlError('selection %s must have at least select one wire' % str(item))
outwire = WireVector(bitwidth=len(selectednums))
net = LogicNet(
op='s',
op_param=selectednums,
args=(self,),
dests=(outwire,))
working_block().add_net(net)
return outwire
def replace_net_with_wire(new_wire):
if isinstance(net_checking.dests[0], Output):
replace_net(LogicNet('w', None, args=(new_wire,),
dests=net_checking.dests))
else:
nets_to_remove.add(net_checking)
new_wire_src[net_checking.dests[0]] = new_wire
# src and dst in this function are all relative to wires
block = working_block(block)
if new_src is not orig_wire and orig_wire in src_nets:
# don't need to add the new_src and new_dst because they were made added at creation
net = src_nets[orig_wire]
new_net = LogicNet(
op=net.op, op_param=net.op_param, args=net.args,
dests=tuple(new_src if w is orig_wire else w for w in net.dests))
remove_net(net)
add_net(new_net)
if new_dst is not orig_wire and orig_wire in dst_nets:
old_nets = tuple(dst_nets[orig_wire]) # need a copy bc the original will be modified
for net in old_nets:
new_net = LogicNet(
op=net.op, op_param=net.op_param, dests=net.dests,
args=tuple(new_dst if w is orig_wire else w for w in net.args))
remove_net(net)
add_net(new_net)
if new_dst is not orig_wire and new_src is not orig_wire:
block.remove_wirevector(orig_wire)
significant bit and so if you unpack the list into the arguements here it will be
backwards. The function concat_list is provided for that case specifically.
Example using concat to combine two bytes into a 16-bit quantity: ::
concat( msb, lsb )
"""
if len(args) <= 0:
raise PyrtlError('error, concat requires at least 1 argument')
if len(args) == 1:
return as_wires(args[0])
arg_wirevectors = tuple(as_wires(arg) for arg in args)
final_width = sum(len(arg) for arg in arg_wirevectors)
outwire = WireVector(bitwidth=final_width)
net = LogicNet(
op='c',
op_param=None,
args=arg_wirevectors,
dests=(outwire,))
working_block().add_net(net)
return outwire
:param WireVector falsecase: the WireVector selected if select==0
:param WireVector truecase: the WireVector selected if select==1
The hardware this generates is exactly the same as "mux" but by putting the
true case as the first argument it matches more of the C-style ternary operator
semantics which can be helpful for readablity.
Example of mux as "ternary operator" to take the max of 'a' and 5: ::
select( a<5, truecase=a, falsecase=5 )
"""
sel, f, t = (as_wires(w) for w in (sel, falsecase, truecase))
f, t = match_bitwidth(f, t)
outwire = WireVector(bitwidth=len(f))
net = LogicNet(op='x', op_param=None, args=(sel, f, t), dests=(outwire,))
working_block().add_net(net) # this includes sanity check on the mux
return outwire
def _build(self, next):
# this actually builds the register which might be from directly setting
# the property "next" or delayed when there is a conditional assignement
self.reg_in = next
net = LogicNet('r', None, args=(self.reg_in,), dests=(self,))
working_block().add_net(net)