Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def __iadd__(self, *nets_pins_buses):
nets_pins = []
for item in expand_buses(flatten(nets_pins_buses)):
if isinstance(item, (Pin, Net, ProtoNet)):
nets_pins.append(item)
else:
log_and_raise(
logger,
ValueError,
"Can't make connections to a {} ({}).".format(
type(item), item.__name__
),
)
if len(nets_pins) != len(self):
if Net in [type(item) for item in self] or len(nets_pins) > 1:
log_and_raise(
logger,
ValueError,
"Connection mismatch {} != {}!".format(len(self), len(nets_pins)),
def insert(self, index, *objects):
"""Insert objects into bus starting at indexed position."""
for obj in flatten(objects):
if isinstance(obj, int):
# Add a number of new nets to the bus.
for _ in range(obj):
self.nets.insert(index, Net())
index += obj
elif isinstance(obj, Net):
# Add an existing net to the bus.
self.nets.insert(index, obj)
index += 1
elif isinstance(obj, Pin):
# Add a pin to the bus.
try:
# Add the pin's net to the bus.
self.nets.insert(index, obj.get_nets()[0])
except IndexError:
# OK, the pin wasn't already connected to a net,
# so create a new net, add it to the bus, and
# connect the pin to it.
n = Net()
n += obj
def create_network(self):
"""Create a network from a single ProtoNet."""
self += Net() # Turn ProtoNet into a Net.
ntwk = Network()
ntwk.append(self)
return ntwk
kwargs = {}
for key, param_name in kw.items():
try:
# The key indicates some attribute of the part.
part_attr = getattr(part, key)
except AttributeError:
pass
else:
# If the keyword argument is a Part, then substitute the part
# reference because it's probably a control current for something
# like a current-controlled source or switch.
if isinstance(part_attr, Part):
kwargs.update({param_name: part_attr.ref})
# If the keyword argument is a Net, substitute the net name.
elif isinstance(part_attr, Net):
kwargs.update({param_name: node(part_attr)})
# If the keyword argument is a Pin, skip it. It gets handled below.
elif isinstance(part_attr, Pin):
continue
else:
kwargs.update({param_name: part_attr})
for pin in part.pins:
if pin.is_connected():
try:
param_name = kw[pin.name]
kwargs.update({param_name: node(pin)})
except KeyError:
logger.error(
"Part {}-{} has no {} pin: {}".format(
part.ref, part.name, pin.name, part
def __iadd__(self, *nets_pins_buses):
from .Bus import Bus
nets_pins = []
for item in expand_buses(flatten(nets_pins_buses)):
if isinstance(item, (Pin, Net)):
nets_pins.append(item)
else:
log_and_raise(
logger,
ValueError,
"Can't make connections to a {} ({}).".format(
type(item), item.__name__
),
)
sz = len(nets_pins)
if sz == 0:
log_and_raise(
logger,
ValueError,
"Connecting empty set of pins, nets, busses to a {}".format(
"""
Do an electrical rules check on a circuit.
"""
from .Net import Net
# Check the nets for errors:
# 1. Merge names to get a single name for all multi-segment nets.
# 2. Find the set of unique net names.
# 3. Get the net associated with each name and do an ERC on it.
# This prevents flagging the same error multiple times by running
# ERC on different segments of a multi-segment net.
circuit._merge_net_names()
net_names = set([net.name for net in circuit.nets])
for name in net_names:
Net.get(name, circuit=circuit).ERC()
# Check parts, interfaces & packages for errors:
for piece in circuit.parts + circuit.interfaces + circuit.packages:
piece.ERC()
def insert(self, index, *objects):
"""Insert objects into bus starting at indexed position."""
for obj in flatten(objects):
if isinstance(obj, int):
# Add a number of new nets to the bus.
for _ in range(obj):
self.nets.insert(index, Net())
index += obj
elif isinstance(obj, Net):
# Add an existing net to the bus.
self.nets.insert(index, obj)
index += 1
elif isinstance(obj, Pin):
# Add a pin to the bus.
try:
# Add the pin's net to the bus.
self.nets.insert(index, obj.get_nets()[0])
except IndexError:
# OK, the pin wasn't already connected to a net,
# so create a new net, add it to the bus, and
# connect the pin to it.
n = Net()
n += obj
self.nets.insert(index, n)
index += 1
if isinstance(pn, ProtoNet):
pn += self
elif isinstance(pn, Pin):
# Connecting pin-to-pin.
if self.is_connected():
# If self is already connected to a net, then add the
# other pin to the same net.
self.nets[0] += pn
elif pn.is_connected():
# If self is unconnected but the other pin is, then
# connect self to the other pin's net.
pn.nets[0] += self
else:
# Neither pin is connected to a net, so create a net
# in the same circuit as the pin and attach both to it.
Net(circuit=self.part.circuit).connect(self, pn)
elif isinstance(pn, Net):
# Connecting pin-to-net, so just connect the pin to the net.
pn += self
else:
log_and_raise(
logger,
TypeError,
"Cannot attach non-Pin/non-Net {} to {}.".format(
type(pn), self.erc_desc()
),
)
# Set the flag to indicate this result came from the += operator.
self.iadd_flag = True # pylint: disable=attribute-defined-outside-init
return self
)
sz = len(nets_pins)
if sz == 0:
log_and_raise(
logger,
ValueError,
"Connecting empty set of pins, nets, busses to a {}".format(
self.__class__.__name__
),
)
else:
# Create implicitly-named net/bus so the name will be overridden
# by whatever connects to it.
if sz == 1:
cnct = Net(name=None, circuit=self.circuit)
else:
cnct = Bus(None, sz, circuit=self.circuit)
cnct.iadd_flag = True
try:
cnct.intfc_key = self.intfc_key
self.intfc[self.intfc_key] = cnct
except AttributeError:
pass
cnct += nets_pins
return cnct