Ejemplo n.º 1
0
    def _get_full_guideline(self, gldict, device=None):
        if device and fpiswire(device):
            qty_typeclass = Length
        else:
            qty_typeclass = int

        oqty_min = self._get_guideline_param(
            'oqty_min', gldict, default=1, typeclass=qty_typeclass
        )

        oqty_multiple = self._get_guideline_param(
            'oqty_multiple', gldict, default=1, typeclass=qty_typeclass
        )

        baseline_qty = self._get_guideline_param(
            'baseline_qty', gldict, default=0, typeclass=qty_typeclass
        )

        excess_min_pc = self._get_guideline_param(
            'excess_min_pc', gldict, default=0, typeclass=Decimal
        )

        excess_min_qty = self._get_guideline_param(
            'excess_min_qty', gldict, default=0, typeclass=qty_typeclass
        )

        excess_max_qty = self._get_guideline_param(
            'excess_max_qty', gldict, default=-1, typeclass=qty_typeclass
        )

        return oqty_min, oqty_multiple, baseline_qty, \
            excess_min_pc, excess_min_qty, excess_max_qty
Ejemplo n.º 2
0
def get_devices():
    rval = []
    for device, desc in electronics.DEVICE_CLASSES_DOC:
        rval.append(
            (device, electronics.fpiswire(device), electronics.fpismodlen(device), electronics.no_fp(device), desc)
        )
    return rval
Ejemplo n.º 3
0
def get_devices():
    rval = []
    for device, desc in electronics.DEVICE_CLASSES_DOC:
        rval.append(
            (device, electronics.fpiswire(device),
             electronics.fpismodlen(device), electronics.no_fp(device), desc))
    return rval
Ejemplo n.º 4
0
 def collapse_wires(self):
     for line in self.lines:
         device, value, footprint = parse_ident(line.ident)
         if device is None:
             continue
         if fpiswire(device):
             newident = device + ' ' + value
             newline = self.find_by_ident(newident)
             if newline is None:
                 line.ident = newident
             else:
                 newline.merge_line(line)
                 self.lines.remove(line)
Ejemplo n.º 5
0
 def collapse_wires(self):
     for line in self.lines:
         device, value, footprint = parse_ident(line.ident)
         if device is None:
             continue
         if fpiswire(device):
             newident = device + ' ' + value
             newline = self.find_by_ident(newident)
             if newline is None:
                 line.ident = newident
             else:
                 newline.merge_line(line)
                 self.lines.remove(line)
Ejemplo n.º 6
0
 def sourcing_info_qty(self, qty):
     from tendril.inventory.guidelines import electronics_qty
     from tendril.sourcing.electronics import get_sourcing_information
     from tendril.sourcing.electronics import SourcingException
     if fpiswire(self.device):
         iqty = Length(qty)
     else:
         iqty = qty
     iqty = electronics_qty.get_compliant_qty(self.ident, iqty)
     try:
         vsi = get_sourcing_information(self.ident, iqty, allvendors=True)
     except SourcingException:
         vsi = []
     return vsi
Ejemplo n.º 7
0
    def indicative_sourcing_info(self):
        if self._indicative_sourcing_info is None:
            from tendril.inventory.guidelines import electronics_qty
            from tendril.sourcing.electronics import get_sourcing_information
            from tendril.sourcing.electronics import SourcingException

            if fpiswire(self.device):
                iqty = Length("1m")
            else:
                iqty = 1
            iqty = electronics_qty.get_compliant_qty(self.ident, iqty)
            try:
                vsi = get_sourcing_information(self.ident, iqty, allvendors=True)
            except SourcingException:
                vsi = []
            self._indicative_sourcing_info = vsi
        return self._indicative_sourcing_info
Ejemplo n.º 8
0
 def uquantity(self):
     device, value, footprint = parse_ident(self.ident)
     if device is None:
         logger.warning("Device not identified : " + self.ident)
     elif fpiswire(device):
         try:
             elen = Length(footprint) * Decimal(0.1)
             if elen < Length('5mm'):
                 elen = Length('5mm')
             elif elen > Length('1inch'):
                 elen = Length('1inch')
             return len(self.refdeslist) * (Length(footprint) + elen)
         except ValueError:
             logger.error(
                 "Problem parsing length for ident : " + self.ident
             )
             raise
     return len(self.refdeslist)
Ejemplo n.º 9
0
 def sourcing_info_qty(self, qty):
     # TODO Complete Migration
     try:
         from tendril.inventory.guidelines import electronics_qty
         from tendril.sourcing.electronics import get_sourcing_information
         from tendril.sourcing.electronics import SourcingException
     except ImportError:
         return []
     if fpiswire(self.device) and not isinstance(qty, Length):
         iqty = Length(qty)
     else:
         iqty = qty
     iqty = electronics_qty.get_compliant_qty(self.ident, iqty)
     try:
         vsi = get_sourcing_information(self.ident, iqty, allvendors=True)
     except SourcingException:
         vsi = []
     return vsi
Ejemplo n.º 10
0
 def uquantity(self):
     device, value, footprint = parse_ident(self.ident)
     if device is None:
         # TODO
         # logger.warning("Device not identified : " + self.ident)
         pass
     elif fpiswire(device):
         try:
             elen = Length(footprint) * Decimal(0.1)
             if elen < Length('5mm'):
                 elen = Length('5mm')
             elif elen > Length('1inch'):
                 elen = Length('1inch')
             return len(self.refdeslist) * (Length(footprint) + elen)
         except ValueError:
             logger.error(
                 "Problem parsing length for ident : " + self.ident
             )
             raise
     return len(self.refdeslist)
Ejemplo n.º 11
0
    def _get_full_guideline(self, gldict, device=None):
        if device and fpiswire(device):
            qty_typeclass = Length
        else:
            qty_typeclass = int

        oqty_min = self._get_guideline_param('oqty_min',
                                             gldict,
                                             default=1,
                                             typeclass=qty_typeclass)

        oqty_multiple = self._get_guideline_param('oqty_multiple',
                                                  gldict,
                                                  default=1,
                                                  typeclass=qty_typeclass)

        baseline_qty = self._get_guideline_param('baseline_qty',
                                                 gldict,
                                                 default=0,
                                                 typeclass=qty_typeclass)

        excess_min_pc = self._get_guideline_param('excess_min_pc',
                                                  gldict,
                                                  default=0,
                                                  typeclass=Decimal)

        excess_min_qty = self._get_guideline_param('excess_min_qty',
                                                   gldict,
                                                   default=0,
                                                   typeclass=qty_typeclass)

        excess_max_qty = self._get_guideline_param('excess_max_qty',
                                                   gldict,
                                                   default=-1,
                                                   typeclass=qty_typeclass)

        return oqty_min, oqty_multiple, baseline_qty, \
            excess_min_pc, excess_min_qty, excess_max_qty
Ejemplo n.º 12
0
def create_obom_from_listing(component_list, head):
    obom_descriptor = OutputElnBomDescriptor(head, None,
                                             head, None)
    obom = OutputBom(obom_descriptor)
    for line in component_list:
        device, value, footprint = parse_ident(line['ident'])
        from tendril.boms.electronics import EntityElnComp
        item = EntityElnComp()
        item.define('Undef', device, value, footprint)
        if device and fpiswire(device):
            length = Length(line['qty'])
            if length > 0:
                wireitem = EntityElnComp()
                wireitem.define(
                    'Undef', device, value, str(length)
                )
                obom.insert_component(wireitem)
        else:
            num = int(line['qty'])
            if num > 0:
                for i in range(num):
                    obom.insert_component(item)
    return obom
Ejemplo n.º 13
0
def create_obom_from_listing(component_list, head):
    obom_descriptor = OutputElnBomDescriptor(head, None,
                                             head, None)
    obom = OutputBom(obom_descriptor)
    for line in component_list:
        device, value, footprint = parse_ident(line['ident'])
        from tendril.boms.electronics import EntityElnComp
        item = EntityElnComp()
        item.define('Undef', device, value, footprint)
        if device and fpiswire(device):
            length = Length(line['qty'])
            if length > 0:
                wireitem = EntityElnComp()
                wireitem.define(
                    'Undef', device, value, str(length)
                )
                obom.insert_component(wireitem)
        else:
            num = int(line['qty'])
            if num > 0:
                for i in range(num):
                    obom.insert_component(item)
    return obom
Ejemplo n.º 14
0
def load_cobom_from_file(f, name, tf=None, verbose=True, generic=False):
    bomlist = []
    header = []
    reader = csv.reader(f)
    for line in reader:
        line = [elem.strip() for elem in line]
        if line[0] == 'device':
            header = line
            break

    if verbose:
        logger.info('Inserting External Boms')
    oboms = []
    for head in header[1:-1]:
        if verbose:
            logger.info('Creating Bom : ' + head)
        obom_descriptor = OutputElnBomDescriptor(head,
                                                 None,
                                                 head, None)
        obom = OutputBom(obom_descriptor)
        oboms.append(obom)

    for line in reader:
        line = [elem.strip() for elem in line]
        if line[0] == '':
            continue
        if line[0] == 'END':
            break
        if tf and not tf.has_contextual_repr(line[0]):
            logger.warn('{0} Possibly not recognized'.format(line[0]))
        if tf:
            device, value, footprint = parse_ident(
                tf.get_canonical_repr(line[0]), generic=generic
            )
        else:
            device, value, footprint = parse_ident(line[0], generic=generic)
        logger.debug("Trying to insert line : " + line[0])
        # print base_tf.get_canonical_repr(line[0])
        from tendril.boms.electronics import EntityElnComp
        item = EntityElnComp()
        item.define('Undef', device, value, footprint)
        for idx, col in enumerate(line[1:-1]):
            if col != '':
                if device and fpiswire(device):
                    length = Length(col)
                    if length > 0:
                        wireitem = EntityElnComp()
                        wireitem.define(
                            'Undef', device, value, str(length)
                        )
                        oboms[idx].insert_component(wireitem)
                else:
                    num = int(col)
                    if num > 0:
                        for i in range(num):
                            oboms[idx].insert_component(item)

    for obom in oboms:
        if verbose:
            logger.info('Inserting External Bom : ' +
                        obom.descriptor.configname)
        bomlist.append(obom)
    cobom = CompositeOutputBom(
        bomlist,
        name=name
    )
    return cobom
Ejemplo n.º 15
0
    def create_output_bom(self, configname, groupname=None):
        if configname not in self.configurations.configuration_names:
            raise ValueError
        outbomdescriptor = OutputElnBomDescriptor(
            self.configurations.pcbname,
            self.configurations.projectfolder,
            configname, self.configurations,
            groupname=groupname
        )
        outbom = OutputBom(outbomdescriptor)
        if groupname is None:
            is_group_bom = False
            outgroups = self.configurations.configuration_grouplist(configname)  # noqa
        else:
            is_group_bom = True
            outgroups = [groupname]

        genlist = self.configurations.configuration_genlist(configname)
        gen_refdeslist = None
        if genlist is not None:
            gen_refdeslist = genlist.keys()

        sjlist = self.configurations.configuration_sjlist(configname)
        sj_refdeslist = None
        if sjlist is not None:
            sj_refdeslist = sjlist.keys()

        ctx = self._validation_context
        _policy_ge = ConfigGroupPolicy(ctx, self._group_policy.known_groups)
        _policy_sj = ConfigSJPolicy(ctx)

        for group in outgroups:
            grpobj = self.find_group(group)
            if grpobj is None:
                e = ConfigGroupError(_policy_ge, group)
                self._validation_errors.add(e)
                continue
            for comp in grpobj.complist:
                if gen_refdeslist is not None and \
                        comp.refdes in gen_refdeslist:
                    # TODO Verify refdes has Generator status in schematic
                    if fpiswire(comp.device):
                        comp.footprint = genlist[comp.refdes]
                    else:
                        comp.value = genlist[comp.refdes]
                if sj_refdeslist is not None and comp.refdes in sj_refdeslist:
                    if not comp.fillstatus == 'CONF':
                        e = ConfigSJUnexpectedError(_policy_sj,
                                                    comp.refdes,
                                                    comp.fillstatus)
                        self._validation_errors.add(e)
                    if sjlist[comp.refdes]:
                        logger.debug("Setting Fillstatus : " + comp.refdes)
                        comp.fillstatus = ''
                    else:
                        logger.debug("Clearing Fillstatus : " + comp.refdes)
                        comp.fillstatus = 'DNP'
                outbom.insert_component(comp)

        motifconfs = self.configurations.configuration_motiflist(configname)
        if motifconfs is None:
            outbom.sort_by_ident()
            outbom.validation_errors.add(self._validation_errors)
            return outbom

        if self._configured_for != configname:
            self.configure_motifs(configname)

        for key, motifconf in motifconfs.iteritems():
            motif = self.get_motif_by_refdes(key)
            if motif is None:
                # This error would already have beed reported when
                # motifs were configured.
                logger.error("Motif not defined : " + key)
                continue
            for item in motif.get_line_gen():
                item_group = item.data['group']
                if item_group == 'unknown' or item_group in outgroups and \
                        item.data['fillstatus'] != 'DNP':
                    outbom.insert_component(EntityElnComp(item))

        outbom.sort_by_ident()
        outbom.validation_errors.add(self._validation_errors)
        return outbom
Ejemplo n.º 16
0
    def create_output_bom(self, configname, groupname=None):
        if configname not in self.configurations.configuration_names:
            raise ValueError
        outbomdescriptor = OutputElnBomDescriptor(
            self.configurations.pcbname,
            self.configurations.projectfolder,
            configname, self.configurations,
            groupname=groupname
        )
        outbom = OutputBom(outbomdescriptor)
        if groupname is None:
            is_group_bom = False
            outgroups = self.configurations.configuration_grouplist(configname)  # noqa
        else:
            is_group_bom = True
            outgroups = [groupname]

        genlist = self.configurations.configuration_genlist(configname)
        gen_refdeslist = None
        if genlist is not None:
            gen_refdeslist = genlist.keys()

        sjlist = self.configurations.configuration_sjlist(configname)
        sj_refdeslist = None
        if sjlist is not None:
            sj_refdeslist = sjlist.keys()

        ctx = self._validation_context
        _policy_ge = ConfigGroupPolicy(ctx, self._group_policy.known_groups)
        _policy_sj = ConfigSJPolicy(ctx)

        for group in outgroups:
            grpobj = self.find_group(group)
            if grpobj is None:
                e = ConfigGroupError(_policy_ge, group)
                self._validation_errors.add(e)
                continue
            for comp in grpobj.complist:
                if gen_refdeslist is not None and \
                        comp.refdes in gen_refdeslist:
                    # TODO Verify refdes has Generator status in schematic
                    if fpiswire(comp.device):
                        comp.footprint = genlist[comp.refdes]
                    else:
                        comp.value = genlist[comp.refdes]
                if sj_refdeslist is not None and comp.refdes in sj_refdeslist:
                    if not comp.fillstatus == 'CONF':
                        e = ConfigSJUnexpectedError(_policy_sj,
                                                    comp.refdes,
                                                    comp.fillstatus)
                        self._validation_errors.add(e)
                    if sjlist[comp.refdes]:
                        logger.debug("Setting Fillstatus : " + comp.refdes)
                        comp.fillstatus = ''
                    else:
                        logger.debug("Clearing Fillstatus : " + comp.refdes)
                        comp.fillstatus = 'DNP'
                outbom.insert_component(comp)

        motifconfs = self.configurations.configuration_motiflist(configname)
        if motifconfs is None:
            outbom.sort_by_ident()
            outbom.validation_errors.add(self._validation_errors)
            return outbom

        if self._configured_for != configname:
            self.configure_motifs(configname)

        for key, motifconf in motifconfs.iteritems():
            motif = self.get_motif_by_refdes(key)
            if motif is None:
                # This error would already have beed reported when
                # motifs were configured.
                logger.error("Motif not defined : " + key)
                continue
            for item in motif.get_line_gen():
                item_group = self.find_tgroup(item).groupname
                if item_group == 'unknown' or item_group in outgroups and \
                        item.data['fillstatus'] != 'DNP':
                    outbom.insert_component(EntityElnComp(item))

        outbom.sort_by_ident()
        outbom.validation_errors.add(self._validation_errors)
        return outbom
Ejemplo n.º 17
0
 def is_wire(self):
     return fpiswire(self.device)
Ejemplo n.º 18
0
 def is_wire(self):
     return fpiswire(self.device)
Ejemplo n.º 19
0
def load_cobom_from_file(f, name, tf=None, verbose=True, generic=False):
    bomlist = []
    header = []
    reader = csv.reader(f)
    for line in reader:
        line = [elem.strip() for elem in line]
        if line[0] == 'device':
            header = line
            break

    if verbose:
        logger.info('Inserting External Boms')
    oboms = []
    for head in header[1:-1]:
        if verbose:
            logger.info('Creating Bom : ' + head)
        obom_descriptor = OutputElnBomDescriptor(head,
                                                 None,
                                                 head, None)
        obom = OutputBom(obom_descriptor)
        oboms.append(obom)

    for line in reader:
        line = [elem.strip() for elem in line]
        if line[0] == '':
            continue
        if line[0] == 'END':
            break
        if tf and not tf.has_contextual_repr(line[0]):
            logger.warn('{0} Possibly not recognized'.format(line[0]))
        if tf:
            device, value, footprint = parse_ident(
                tf.get_canonical_repr(line[0]), generic=generic
            )
        else:
            device, value, footprint = parse_ident(line[0], generic=generic)
        logger.debug("Trying to insert line : " + line[0])
        # print base_tf.get_canonical_repr(line[0])
        from tendril.boms.electronics import EntityElnComp
        item = EntityElnComp()
        item.define('Undef', device, value, footprint)
        for idx, col in enumerate(line[1:-1]):
            if col != '':
                if device and fpiswire(device):
                    length = Length(col)
                    if length > 0:
                        wireitem = EntityElnComp()
                        wireitem.define(
                            'Undef', device, value, str(length)
                        )
                        oboms[idx].insert_component(wireitem)
                else:
                    num = int(col)
                    if num > 0:
                        for i in range(num):
                            oboms[idx].insert_component(item)

    for obom in oboms:
        if verbose:
            logger.info('Inserting External Bom : ' +
                        obom.descriptor.configname)
        bomlist.append(obom)
    cobom = CompositeOutputBom(
        bomlist,
        name=name
    )
    return cobom