diff --git a/kibot/globals.py b/kibot/globals.py index b9dd6f92..f9f1b5af 100644 --- a/kibot/globals.py +++ b/kibot/globals.py @@ -10,6 +10,7 @@ from .pre_filters import FiltersOptions from .log import get_logger, set_filters from .misc import W_MUSTBEINT from .kicad.sexpdata import load, SExpData, sexp_iter, Symbol +from .kicad.v6_sch import PCBLayer class Globals(FiltersOptions): @@ -55,6 +56,7 @@ class Globals(FiltersOptions): Read `solder_mask_color` help """ self.silk_screen_color = 'white' """ Color for the markings. Currently used for documentation and to choose default colors. + KiCad 6: you should set this in the Board Setup -> Physical Stackup. Currently known are black and white """ self.silk_screen_color_top = '' """ Color for the top silk screen. When not defined `silk_screen_color` is used. @@ -78,6 +80,9 @@ class Globals(FiltersOptions): KiCad 6: you should set this in the Board Setup -> Board Finish -> Plated board edge """ self.copper_finish = None """ {pcb_finish} """ + self.copper_thickness = 35 + """ Copper thickness in micrometers (1 Oz is 35 micrometers). + KiCad 6: you should set this in the Board Setup -> Physical Stackup """ self.set_doc('filters', " [list(dict)] KiBot warnings to be ignored ") self._filter_what = 'KiBot warnings' self._unkown_is_error = True @@ -111,6 +116,9 @@ class Globals(FiltersOptions): if sp is None: return logger.debug("- Found stack-up information") + stackup = [] + materials = set() + thicknesses = set() for e in sp[1:]: if isinstance(e, list) and isinstance(e[0], Symbol): name = e[0].value() @@ -132,6 +140,45 @@ class Globals(FiltersOptions): elif name == 'edge_plating': self.edge_plating = value == 'yes' logger.debug("- Edge plating: "+value) + elif name == 'layer': + ly = PCBLayer.parse(e) + stackup.append(ly) + if ly.name == "F.SilkS": + if ly.color: + self.silk_screen_color_top = ly.color.lower() + logger.debug("- F.SilkS color: "+ly.color) + elif ly.name == "B.SilkS": + if ly.color: + self.silk_screen_color_bottom = ly.color.lower() + logger.debug("- B.SilkS color: "+ly.color) + elif ly.name == "F.Mask": + if ly.color: + self.solder_mask_color_top = ly.color.lower() + logger.debug("- F.Mask color: "+ly.color) + elif ly.name == "B.Mask": + if ly.color: + self.solder_mask_color_bottom = ly.color.lower() + logger.debug("- B.Mask color: "+ly.color) + elif ly.material: + if not len(materials): + materials.add(ly.material) + self.pcb_material = ly.material + elif ly.material not in materials: + materials.add(ly.material) + self.pcb_material += ' / '+ly.material + elif ly.type == 'copper' and ly.thickness: + if not len(thicknesses): + thicknesses.add(ly.thickness) + self.copper_thickness = str(int(ly.thickness*1000)) + elif ly.thickness not in thicknesses: + thicknesses.add(ly.thickness) + self.copper_thickness += ' / '+str(int(ly.thickness*1000)) + if stackup: + GS.stackup = stackup + if len(materials): + logger.debug("- PCB Material/s: "+self.pcb_material) + if len(thicknesses): + logger.debug("- Copper thickness: "+self.copper_thickness) def config(self, parent): if GS.ki6() and GS.pcb_file and os.path.isfile(GS.pcb_file): diff --git a/kibot/gs.py b/kibot/gs.py index 77d73bc8..a9d49f4b 100644 --- a/kibot/gs.py +++ b/kibot/gs.py @@ -94,10 +94,12 @@ class GS(object): global_silk_screen_color_top = None global_silk_screen_color_bottom = None global_pcb_finish = None + global_copper_thickness = None global_edge_connector = None global_castellated_pads = None global_edge_plating = None test_boolean = True + stackup = None @staticmethod def set_sch(name): diff --git a/kibot/kicad/v6_sch.py b/kibot/kicad/v6_sch.py index 0165c9cf..ef4e1a3a 100644 --- a/kibot/kicad/v6_sch.py +++ b/kibot/kicad/v6_sch.py @@ -1386,6 +1386,43 @@ class SymbolInstance(object): return _symbol('path', data) +# Here because we have al s-expr tools here +class PCBLayer(object): + def __init__(self): + super().__init__() + self.name = '' + self.type = '' + self.color = None + self.thickness = None + self.material = None + self.epsilon_r = None + self.loss_tangent = None + + @staticmethod + def parse(items): + name = 'PCB stackup layer' + layer = PCBLayer() + layer.name = _check_str(items, 1, name) + for c, i in enumerate(items[2:]): + i_type = _check_is_symbol_list(i) + tname = name+' '+i_type + if i_type == 'type': + layer.type = _check_str(i, 1, tname) + elif i_type == 'color': + layer.color = _check_str(i, 1, tname) + elif i_type == 'thickness': + layer.thickness = _check_float(i, 1, tname) + elif i_type == 'material': + layer.material = _check_str(i, 1, tname) + elif i_type == 'epsilon_r': + layer.epsilon_r = _check_float(i, 1, tname) + elif i_type == 'loss_tangent': + layer.loss_tangent = _check_float(i, 1, tname) + else: + logger.warning('Unknown layer attribute `{}`'.format(i)) + return layer + + def _symbol(name, content): return [Symbol(name)] + content diff --git a/kibot/out_report.py b/kibot/out_report.py index 2af2c2a8..3627fa77 100644 --- a/kibot/out_report.py +++ b/kibot/out_report.py @@ -495,6 +495,7 @@ class ReportOptions(BaseOptions): self.edge_connector = solve_edge_connector(GS.global_edge_connector) self.castellated_pads = GS.global_castellated_pads self.edge_plating = GS.global_edge_plating + self.copper_thickness = GS.global_copper_thickness self.collect_data(GS.board) self.do_template(self.template, fname) diff --git a/kibot/report_templates/report_full.txt b/kibot/report_templates/report_full.txt index 5141eb4c..f14f2cc0 100644 --- a/kibot/report_templates/report_full.txt +++ b/kibot/report_templates/report_full.txt @@ -6,6 +6,7 @@ Board size: ${bb_w_mm}x${bb_h_mm} mm (${bb_w_in}x${bb_h_in} inches) - Material: ${pcb_material} - Finish: ${pcb_finish} - Layers: ${layers} +- Copper thickness: ${copper_thickness} µm Solder mask: ${solder_mask} - Color: ${solder_mask_color_text} Silk screen: ${silk_screen} diff --git a/kibot/report_templates/report_simple.txt b/kibot/report_templates/report_simple.txt index b9354c20..d7dab450 100644 --- a/kibot/report_templates/report_simple.txt +++ b/kibot/report_templates/report_simple.txt @@ -22,7 +22,7 @@ Materials: - ${pcb_material}, ${thickness_mm} mm - ${pcb_finish} - ${layers} layers -- 35 µm copper thickness +- ${copper_thickness} µm copper thickness Solder mask: - ${solder_mask} diff --git a/tests/board_samples/kicad_6/light_control.kicad_pcb b/tests/board_samples/kicad_6/light_control.kicad_pcb index 277f65e1..a523ab3e 100644 --- a/tests/board_samples/kicad_6/light_control.kicad_pcb +++ b/tests/board_samples/kicad_6/light_control.kicad_pcb @@ -37,9 +37,9 @@ (setup (stackup - (layer "F.SilkS" (type "Top Silk Screen")) + (layer "F.SilkS" (type "Top Silk Screen") (color "White")) (layer "F.Paste" (type "Top Solder Paste")) - (layer "F.Mask" (type "Top Solder Mask") (thickness 0.01)) + (layer "F.Mask" (type "Top Solder Mask") (color "Blue") (thickness 0.01)) (layer "F.Cu" (type "copper") (thickness 0.035)) (layer "dielectric 1" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02)) (layer "In1.Cu" (type "copper") (thickness 0.035)) @@ -47,9 +47,9 @@ (layer "In2.Cu" (type "copper") (thickness 0.035)) (layer "dielectric 3" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02)) (layer "B.Cu" (type "copper") (thickness 0.035)) - (layer "B.Mask" (type "Bottom Solder Mask") (thickness 0.01)) + (layer "B.Mask" (type "Bottom Solder Mask") (color "Red") (thickness 0.01)) (layer "B.Paste" (type "Bottom Solder Paste")) - (layer "B.SilkS" (type "Bottom Silk Screen")) + (layer "B.SilkS" (type "Bottom Silk Screen") (color "Black")) (copper_finish "ENIG") (dielectric_constraints no) (edge_connector bevelled) diff --git a/tests/reference/5_1_6/light_control-report.txt b/tests/reference/5_1_6/light_control-report.txt index a19dbf65..b1110b80 100644 --- a/tests/reference/5_1_6/light_control-report.txt +++ b/tests/reference/5_1_6/light_control-report.txt @@ -6,6 +6,7 @@ Board size: 59.69x48.26 mm (2.35x1.9 inches) - Material: FR4 - Finish: ENIG - Layers: 4 +- Copper thickness: 35 µm Solder mask: TOP / BOTTOM - Color: Top: Blue / Bottom: Red Silk screen: TOP / BOTTOM diff --git a/tests/reference/6_0_0/light_control-report.txt b/tests/reference/6_0_0/light_control-report.txt index b0349c24..d8c70408 100644 --- a/tests/reference/6_0_0/light_control-report.txt +++ b/tests/reference/6_0_0/light_control-report.txt @@ -6,10 +6,11 @@ Board size: 59.69x48.26 mm (2.35x1.9 inches) - Material: FR4 - Finish: ENIG - Layers: 4 +- Copper thickness: 35 µm Solder mask: TOP / BOTTOM - Color: Top: Blue / Bottom: Red Silk screen: TOP / BOTTOM -- Color: White +- Color: Top: White / Bottom: Black Special features: - Edge connector: yes, bevelled diff --git a/tests/reference/6_0_0/light_control-report_simple.txt b/tests/reference/6_0_0/light_control-report_simple.txt index b294cd1a..1c4af8a7 100644 --- a/tests/reference/6_0_0/light_control-report_simple.txt +++ b/tests/reference/6_0_0/light_control-report_simple.txt @@ -26,7 +26,7 @@ Solder mask: Marking: - TOP / BOTTOM screen printing -- Silk: White +- Silk: Top: White / Bottom: Black Other markings: - ROHS / UL / Date - Yes if available