From b8234e0f3b6552a22db007284f2b6b44d0f9e75f Mon Sep 17 00:00:00 2001 From: Jerome Marchand Date: Mon, 20 May 2013 13:02:27 +0200 Subject: [PATCH 1/1] This commit provides IPC-D-356 netlist creation ability to PCB. Signed-off-by: Bert Timmerman --- configure.ac | 3 +- src/Makefile.am | 12 +- src/find.c | 2838 +++++++++++++++-------------- src/find.h | 1 + src/hid/ipcd356/hid.conf | 1 + src/hid/ipcd356/ipcd356.c | 709 +++++++ src/hid/ipcd356/ipcd356.h | 55 + tests/golden/Makefile.am | 4 +- tests/golden/hid_ipcd356/Makefile.am | 4 + tests/golden/hid_ipcd356/ipcd356_test.ipc | 208 +++ tests/inputs/Makefile.am | 3 +- tests/inputs/ipcd356.pcb | 2141 ++++++++++++++++++++++ tests/tests.list | 13 + 13 files changed, 4584 insertions(+), 1408 deletions(-) create mode 100644 src/hid/ipcd356/hid.conf create mode 100644 src/hid/ipcd356/ipcd356.c create mode 100644 src/hid/ipcd356/ipcd356.h create mode 100644 tests/golden/hid_ipcd356/Makefile.am create mode 100644 tests/golden/hid_ipcd356/ipcd356_test.ipc create mode 100644 tests/inputs/ipcd356.pcb diff --git a/configure.ac b/configure.ac index 322f412..d0bbb9c 100644 --- a/configure.ac +++ b/configure.ac @@ -431,7 +431,7 @@ esac AC_MSG_CHECKING([for which exporters to use]) AC_ARG_WITH([exporters], -[ --with-exporters= Enable export devices: bom gerber gcode nelma png ps [[default=bom gerber gcode nelma png ps]]], +[ --with-exporters= Enable export devices: bom gerber gcode nelma png ps ipcd356 [[default=bom gerber gcode ipcd356 nelma png ps]]], [],[with_exporters=$hid_exporters]) AC_MSG_RESULT([$with_exporters]) for e in `echo $with_exporters | sed 's/,/ /g'`; do @@ -1321,6 +1321,7 @@ AC_CONFIG_FILES(tests/golden/hid_gerber3/Makefile) AC_CONFIG_FILES(tests/golden/hid_png1/Makefile) AC_CONFIG_FILES(tests/golden/hid_png2/Makefile) AC_CONFIG_FILES(tests/golden/hid_png3/Makefile) +AC_CONFIG_FILES(tests/golden/hid_ipcd356/Makefile) AC_CONFIG_FILES(tests/Makefile) dnl GTS 0.7.6 - http://gts.sourceforge.net/ diff --git a/src/Makefile.am b/src/Makefile.am index 66c957b..25f6f76 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -13,7 +13,7 @@ noinst_LIBRARIES = @HIDLIBS@ EXTRA_LIBRARIES = \ libgtk.a liblesstif.a libbatch.a \ liblpr.a libgerber.a libbom.a libpng.a libps.a libnelma.a \ - libgcode.a + libgcode.a libipcd356.a pcblib_DATA= \ default_font \ @@ -228,6 +228,7 @@ EXTRA_DIST= \ $(srcdir)/hid/gtk/gui-icons-mode-buttons.data \ $(srcdir)/hid/gtk/hid.conf \ $(srcdir)/hid/gtk/pcb.rc \ + $(srcdir)/hid/ipcd356/hid.conf \ $(srcdir)/hid/lesstif/hid.conf \ $(srcdir)/hid/lpr/hid.conf \ $(srcdir)/hid/png/hid.conf \ @@ -389,6 +390,14 @@ libbom_a_SOURCES = \ hid/hidint.h \ hid/bom/bom.c + +LIBIPCD356_SRCS = \ + hid/hidint.h \ + hid/ipcd356/ipcd356.c + +libipcd356_a_SOURCES = ${LIBIPCD356_SRCS} + + libps_a_CPPFLAGS = -I./hid/ps LIBPS_SRCS = \ dolists.h \ @@ -462,6 +471,7 @@ DISTCLEANFILES= pcbtest.sh gpcb-menu.h pcb-menu.h \ hid/batch/batch_lists.h \ hid/common/hidlist.h \ hid/gtk/gtk_lists.h \ + hid/ipcd356/ipcd356_lists.h \ hid/lesstif/lesstif_lists.h \ hid/png/png_lists.h \ hid/gcode/gcode_lists.h \ diff --git a/src/find.c b/src/find.c index 05081b0..81dab49 100644 --- a/src/find.c +++ b/src/find.c @@ -124,19 +124,19 @@ #define IS_PV_ON_PAD(PV,Pad) \ ( IsPointInPad((PV)->X, (PV)->Y, MAX((PV)->Thickness/2 +Bloat,0), (Pad))) -static DrcViolationType -*pcb_drc_violation_new (const char *title, - const char *explanation, - Coord x, Coord y, - Angle angle, - bool have_measured, - Coord measured_value, - Coord required_value, - int object_count, - long int *object_id_list, - int *object_type_list) +static DrcViolationType * +pcb_drc_violation_new (const char *title, + const char *explanation, + Coord x, Coord y, + Angle angle, + bool have_measured, + Coord measured_value, + Coord required_value, + int object_count, + long int *object_id_list, int *object_type_list) { - DrcViolationType *violation = (DrcViolationType *)malloc (sizeof (DrcViolationType)); + DrcViolationType *violation = + (DrcViolationType *) malloc (sizeof (DrcViolationType)); violation->title = strdup (title); violation->explanation = strdup (explanation); @@ -154,7 +154,7 @@ static DrcViolationType } static void -pcb_drc_violation_free (DrcViolationType *violation) +pcb_drc_violation_free (DrcViolationType * violation) { free (violation->title); free (violation->explanation); @@ -163,7 +163,7 @@ pcb_drc_violation_free (DrcViolationType *violation) static GString *drc_dialog_message; static void -reset_drc_dialog_message(void) +reset_drc_dialog_message (void) { if (drc_dialog_message) g_string_free (drc_dialog_message, FALSE); @@ -173,8 +173,9 @@ reset_drc_dialog_message(void) gui->drc_gui->reset_drc_dialog_message (); } } + static void -append_drc_dialog_message(const char *fmt, ...) +append_drc_dialog_message (const char *fmt, ...) { gchar *new_str; va_list ap; @@ -188,7 +189,7 @@ append_drc_dialog_message(const char *fmt, ...) static void GotoError (void); static void -append_drc_violation (DrcViolationType *violation) +append_drc_violation (DrcViolationType * violation) { if (gui->drc_gui != NULL) { @@ -199,19 +200,19 @@ append_drc_violation (DrcViolationType *violation) /* Fallback to formatting the violation message as text */ append_drc_dialog_message ("%s\n", violation->title); append_drc_dialog_message (_("%m+near %$mD\n"), - Settings.grid_unit->allow, - violation->x, violation->y); + Settings.grid_unit->allow, + violation->x, violation->y); GotoError (); } - if (gui->drc_gui == NULL || gui->drc_gui->log_drc_violations ) + if (gui->drc_gui == NULL || gui->drc_gui->log_drc_violations) { Message (_("WARNING! Design Rule error - %s\n"), violation->title); Message (_("%m+near location %$mD\n"), - Settings.grid_unit->allow, - violation->x, violation->y); + Settings.grid_unit->allow, violation->x, violation->y); } } + /* * message when asked about continuing DRC checks after next * violation is found. @@ -221,7 +222,7 @@ append_drc_violation (DrcViolationType *violation) #define DRC_CANCEL _("Cancel") static int -throw_drc_dialog(void) +throw_drc_dialog (void) { int r; @@ -234,7 +235,7 @@ throw_drc_dialog(void) /* Fallback to formatting the violation message as text */ append_drc_dialog_message (DRC_CONTINUE); r = gui->confirm_dialog (drc_dialog_message->str, DRC_CANCEL, DRC_NEXT); - reset_drc_dialog_message(); + reset_drc_dialog_message (); } return r; } @@ -247,9 +248,9 @@ throw_drc_dialog(void) */ typedef struct { - void **Data; /* pointer to index data */ - Cardinal Location, /* currently used position */ - DrawLocation, Number, /* number of objects in list */ + void **Data; /* pointer to index data */ + Cardinal Location, /* currently used position */ + DrawLocation, Number, /* number of objects in list */ Size; } ListType; @@ -259,11 +260,11 @@ typedef struct static Coord Bloat = 0; static void *thing_ptr1, *thing_ptr2, *thing_ptr3; static int thing_type; -static bool User = false; /* user action causing this */ -static bool drc = false; /* whether to stop if finding something not found */ -static Cardinal drcerr_count; /* count of drc errors */ +static bool User = false; /* user action causing this */ +static bool drc = false; /* whether to stop if finding something not found */ +static Cardinal drcerr_count; /* count of drc errors */ static Cardinal TotalP, TotalV; -static ListType LineList[MAX_LAYER], /* list of objects to */ +static ListType LineList[MAX_LAYER], /* list of objects to */ PolygonList[MAX_LAYER], ArcList[MAX_LAYER], PadList[2], RatList, PVList; /* --------------------------------------------------------------------------- @@ -292,21 +293,22 @@ static bool IsPolygonInPolygon (PolygonType *, PolygonType *); * struct starts with a line struct. See global.h for details */ bool -LinePadIntersect (LineType *Line, PadType *Pad) +LinePadIntersect (LineType * Line, PadType * Pad) { - return LineLineIntersect ((Line), (LineType *)Pad); + return LineLineIntersect ((Line), (LineType *) Pad); } bool -ArcPadIntersect (ArcType *Arc, PadType *Pad) +ArcPadIntersect (ArcType * Arc, PadType * Pad) { return LineArcIntersect ((LineType *) (Pad), (Arc)); } static bool -add_object_to_list (ListType *list, int type, void *ptr1, void *ptr2, void *ptr3, int flag) +add_object_to_list (ListType * list, int type, void *ptr1, void *ptr2, + void *ptr3, int flag) { - AnyObjectType *object = (AnyObjectType *)ptr2; + AnyObjectType *object = (AnyObjectType *) ptr2; if (User) AddObjectToFlagUndoList (type, ptr1, ptr2, ptr3); @@ -317,7 +319,8 @@ add_object_to_list (ListType *list, int type, void *ptr1, void *ptr2, void *ptr3 #ifdef DEBUG if (list.Number > list.Size) - printf ("add_object_to_list overflow! type=%i num=%d size=%d\n", type, list.Number, list.Size); + printf ("add_object_to_list overflow! type=%i num=%d size=%d\n", type, + list.Number, list.Size); #endif if (drc && !TEST_FLAG (SELECTEDFLAG, object)) @@ -326,44 +329,49 @@ add_object_to_list (ListType *list, int type, void *ptr1, void *ptr2, void *ptr3 } static bool -ADD_PV_TO_LIST (PinType *Pin, int flag) +ADD_PV_TO_LIST (PinType * Pin, int flag) { return add_object_to_list (&PVList, Pin->Element ? PIN_TYPE : VIA_TYPE, - Pin->Element ? Pin->Element : Pin, Pin, Pin, flag); + Pin->Element ? Pin->Element : Pin, Pin, Pin, + flag); } static bool -ADD_PAD_TO_LIST (Cardinal L, PadType *Pad, int flag) +ADD_PAD_TO_LIST (Cardinal L, PadType * Pad, int flag) { - return add_object_to_list (&PadList[L], PAD_TYPE, Pad->Element, Pad, Pad, flag); + return add_object_to_list (&PadList[L], PAD_TYPE, Pad->Element, Pad, Pad, + flag); } static bool -ADD_LINE_TO_LIST (Cardinal L, LineType *Ptr, int flag) +ADD_LINE_TO_LIST (Cardinal L, LineType * Ptr, int flag) { - return add_object_to_list (&LineList[L], LINE_TYPE, LAYER_PTR (L), Ptr, Ptr, flag); + return add_object_to_list (&LineList[L], LINE_TYPE, LAYER_PTR (L), Ptr, Ptr, + flag); } static bool -ADD_ARC_TO_LIST (Cardinal L, ArcType *Ptr, int flag) +ADD_ARC_TO_LIST (Cardinal L, ArcType * Ptr, int flag) { - return add_object_to_list (&ArcList[L], ARC_TYPE, LAYER_PTR (L), Ptr, Ptr, flag); + return add_object_to_list (&ArcList[L], ARC_TYPE, LAYER_PTR (L), Ptr, Ptr, + flag); } static bool -ADD_RAT_TO_LIST (RatType *Ptr, int flag) +ADD_RAT_TO_LIST (RatType * Ptr, int flag) { return add_object_to_list (&RatList, RATLINE_TYPE, Ptr, Ptr, Ptr, flag); } static bool -ADD_POLYGON_TO_LIST (Cardinal L, PolygonType *Ptr, int flag) +ADD_POLYGON_TO_LIST (Cardinal L, PolygonType * Ptr, int flag) { - return add_object_to_list (&PolygonList[L], POLYGON_TYPE, LAYER_PTR (L), Ptr, Ptr, flag); + return add_object_to_list (&PolygonList[L], POLYGON_TYPE, LAYER_PTR (L), + Ptr, Ptr, flag); } static BoxType -expand_bounds (BoxType *box_in) +expand_bounds (BoxType * box_in) { BoxType box_out = *box_in; @@ -379,22 +387,24 @@ expand_bounds (BoxType *box_in) } bool -PinLineIntersect (PinType *PV, LineType *Line) +PinLineIntersect (PinType * PV, LineType * Line) { /* IsLineInRectangle already has Bloat factor */ return TEST_FLAG (SQUAREFLAG, - PV) ? IsLineInRectangle (PV->X - (PIN_SIZE (PV) + 1) / 2, - PV->Y - (PIN_SIZE (PV) + 1) / 2, - PV->X + (PIN_SIZE (PV) + 1) / 2, - PV->Y + (PIN_SIZE (PV) + 1) / 2, - Line) : IsPointInPad (PV->X, - PV->Y, - MAX (PIN_SIZE (PV) - / - 2.0 + - Bloat, - 0.0), - (PadType *)Line); + PV) ? IsLineInRectangle (PV->X - (PIN_SIZE (PV) + 1) / 2, + PV->Y - (PIN_SIZE (PV) + 1) / 2, + PV->X + (PIN_SIZE (PV) + 1) / 2, + PV->Y + (PIN_SIZE (PV) + 1) / 2, + Line) : IsPointInPad (PV->X, + PV->Y, + MAX + (PIN_SIZE + (PV) / + 2.0 + + Bloat, + 0.0), + (PadType *) + Line); } @@ -409,7 +419,7 @@ SetThing (int type, void *ptr1, void *ptr2, void *ptr3) } bool -BoxBoxIntersection (BoxType *b1, BoxType *b2) +BoxBoxIntersection (BoxType * b1, BoxType * b2) { if (b2->X2 < b1->X1 || b2->X1 > b1->X2) return false; @@ -419,13 +429,13 @@ BoxBoxIntersection (BoxType *b1, BoxType *b2) } static bool -PadPadIntersect (PadType *p1, PadType *p2) +PadPadIntersect (PadType * p1, PadType * p2) { return LinePadIntersect ((LineType *) p1, p2); } static inline bool -PV_TOUCH_PV (PinType *PV1, PinType *PV2) +PV_TOUCH_PV (PinType * PV1, PinType * PV2) { double t1, t2; BoxType b1, b2; @@ -507,7 +517,8 @@ InitComponentLookup (void) for (i = 0; i < 2; i++) { /* allocate memory for working list */ - PadList[i].Data = (void **)calloc (NumberOfPads[i], sizeof (PadType *)); + PadList[i].Data = + (void **) calloc (NumberOfPads[i], sizeof (PadType *)); /* clear some struct members */ PadList[i].Location = 0; @@ -532,24 +543,27 @@ InitLayoutLookup (void) LayerType *layer = LAYER_PTR (i); if (layer->LineN) - { - /* allocate memory for line pointer lists */ - LineList[i].Data = (void **)calloc (layer->LineN, sizeof (LineType *)); - LineList[i].Size = layer->LineN; - } + { + /* allocate memory for line pointer lists */ + LineList[i].Data = + (void **) calloc (layer->LineN, sizeof (LineType *)); + LineList[i].Size = layer->LineN; + } if (layer->ArcN) - { - ArcList[i].Data = (void **)calloc (layer->ArcN, sizeof (ArcType *)); - ArcList[i].Size = layer->ArcN; - } + { + ArcList[i].Data = + (void **) calloc (layer->ArcN, sizeof (ArcType *)); + ArcList[i].Size = layer->ArcN; + } /* allocate memory for polygon list */ if (layer->PolygonN) - { - PolygonList[i].Data = (void **)calloc (layer->PolygonN, sizeof (PolygonType *)); - PolygonList[i].Size = layer->PolygonN; - } + { + PolygonList[i].Data = + (void **) calloc (layer->PolygonN, sizeof (PolygonType *)); + PolygonList[i].Size = layer->PolygonN; + } /* clear some struct members */ LineList[i].Location = 0; @@ -572,13 +586,13 @@ InitLayoutLookup (void) else TotalV = 0; /* allocate memory for 'new PV to check' list and clear struct */ - PVList.Data = (void **)calloc (TotalP + TotalV, sizeof (PinType *)); + PVList.Data = (void **) calloc (TotalP + TotalV, sizeof (PinType *)); PVList.Size = TotalP + TotalV; PVList.Location = 0; PVList.DrawLocation = 0; PVList.Number = 0; /* Initialize ratline data */ - RatList.Data = (void **)calloc (PCB->Data->RatN, sizeof (RatType *)); + RatList.Data = (void **) calloc (PCB->Data->RatN, sizeof (RatType *)); RatList.Size = PCB->Data->RatN; RatList.Location = 0; RatList.DrawLocation = 0; @@ -603,7 +617,7 @@ LOCtoPVline_callback (const BoxType * b, void *cl) !TEST_FLAG (HOLEFLAG, i->pv)) { if (ADD_LINE_TO_LIST (i->layer, line, i->flag)) - longjmp (i->env, 1); + longjmp (i->env, 1); } return 0; } @@ -618,7 +632,7 @@ LOCtoPVarc_callback (const BoxType * b, void *cl) !TEST_FLAG (HOLEFLAG, i->pv)) { if (ADD_ARC_TO_LIST (i->layer, arc, i->flag)) - longjmp (i->env, 1); + longjmp (i->env, 1); } return 0; } @@ -632,7 +646,7 @@ LOCtoPVpad_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, pad) && IS_PV_ON_PAD (i->pv, pad) && !TEST_FLAG (HOLEFLAG, i->pv) && ADD_PAD_TO_LIST (TEST_FLAG (ONSOLDERFLAG, pad) ? SOLDER_LAYER : - COMPONENT_LAYER, pad, i->flag)) + COMPONENT_LAYER, pad, i->flag)) longjmp (i->env, 1); return 0; } @@ -648,6 +662,7 @@ LOCtoPVrat_callback (const BoxType * b, void *cl) longjmp (i->env, 1); return 0; } + static int LOCtoPVpoly_callback (const BoxType * b, void *cl) { @@ -661,33 +676,32 @@ LOCtoPVpoly_callback (const BoxType * b, void *cl) * be on an edge such that it doesn't actually touch. */ if (!TEST_FLAG (i->flag, polygon) && !TEST_FLAG (HOLEFLAG, i->pv) && - (TEST_THERM (i->layer, i->pv) || - !TEST_FLAG (CLEARPOLYFLAG, - polygon) - || !i->pv->Clearance)) + (TEST_THERM (i->layer, i->pv) || + !TEST_FLAG (CLEARPOLYFLAG, polygon) || !i->pv->Clearance)) { double wide = MAX (0.5 * i->pv->Thickness + Bloat, 0); if (TEST_FLAG (SQUAREFLAG, i->pv)) - { - Coord x1 = i->pv->X - (i->pv->Thickness + 1 + Bloat) / 2; - Coord x2 = i->pv->X + (i->pv->Thickness + 1 + Bloat) / 2; - Coord y1 = i->pv->Y - (i->pv->Thickness + 1 + Bloat) / 2; - Coord y2 = i->pv->Y + (i->pv->Thickness + 1 + Bloat) / 2; - if (IsRectangleInPolygon (x1, y1, x2, y2, polygon) - && ADD_POLYGON_TO_LIST (i->layer, polygon, i->flag)) - longjmp (i->env, 1); - } + { + Coord x1 = i->pv->X - (i->pv->Thickness + 1 + Bloat) / 2; + Coord x2 = i->pv->X + (i->pv->Thickness + 1 + Bloat) / 2; + Coord y1 = i->pv->Y - (i->pv->Thickness + 1 + Bloat) / 2; + Coord y2 = i->pv->Y + (i->pv->Thickness + 1 + Bloat) / 2; + if (IsRectangleInPolygon (x1, y1, x2, y2, polygon) + && ADD_POLYGON_TO_LIST (i->layer, polygon, i->flag)) + longjmp (i->env, 1); + } else if (TEST_FLAG (OCTAGONFLAG, i->pv)) - { - POLYAREA *oct = OctagonPoly (i->pv->X, i->pv->Y, i->pv->Thickness / 2); - if (isects (oct, polygon, true) - && ADD_POLYGON_TO_LIST (i->layer, polygon, i->flag)) - longjmp (i->env, 1); - } + { + POLYAREA *oct = + OctagonPoly (i->pv->X, i->pv->Y, i->pv->Thickness / 2); + if (isects (oct, polygon, true) + && ADD_POLYGON_TO_LIST (i->layer, polygon, i->flag)) + longjmp (i->env, 1); + } else if (IsPointInPolygon (i->pv->X, i->pv->Y, wide, - polygon) - && ADD_POLYGON_TO_LIST (i->layer, polygon, i->flag)) - longjmp (i->env, 1); + polygon) + && ADD_POLYGON_TO_LIST (i->layer, polygon, i->flag)) + longjmp (i->env, 1); } return 0; } @@ -715,49 +729,49 @@ LookupLOConnectionsToPVList (int flag, bool AndRats) /* check pads */ if (setjmp (info.env) == 0) - r_search (PCB->Data->pad_tree, &search_box, NULL, - LOCtoPVpad_callback, &info); + r_search (PCB->Data->pad_tree, &search_box, NULL, + LOCtoPVpad_callback, &info); else - return true; + return true; /* now all lines, arcs and polygons of the several layers */ for (layer_no = 0; layer_no < max_copper_layer; layer_no++) - { - LayerType *layer = LAYER_PTR (layer_no); - - if (layer->no_drc) - continue; - - info.layer = layer_no; - - /* add touching lines */ - if (setjmp (info.env) == 0) - r_search (layer->line_tree, &search_box, - NULL, LOCtoPVline_callback, &info); - else - return true; - /* add touching arcs */ - if (setjmp (info.env) == 0) - r_search (layer->arc_tree, &search_box, - NULL, LOCtoPVarc_callback, &info); - else - return true; - /* check all polygons */ - if (setjmp (info.env) == 0) - r_search (layer->polygon_tree, &search_box, - NULL, LOCtoPVpoly_callback, &info); - else - return true; - } + { + LayerType *layer = LAYER_PTR (layer_no); + + if (layer->no_drc) + continue; + + info.layer = layer_no; + + /* add touching lines */ + if (setjmp (info.env) == 0) + r_search (layer->line_tree, &search_box, + NULL, LOCtoPVline_callback, &info); + else + return true; + /* add touching arcs */ + if (setjmp (info.env) == 0) + r_search (layer->arc_tree, &search_box, + NULL, LOCtoPVarc_callback, &info); + else + return true; + /* check all polygons */ + if (setjmp (info.env) == 0) + r_search (layer->polygon_tree, &search_box, + NULL, LOCtoPVpoly_callback, &info); + else + return true; + } /* Check for rat-lines that may intersect the PV */ if (AndRats) - { - if (setjmp (info.env) == 0) - r_search (PCB->Data->rat_tree, &search_box, NULL, - LOCtoPVrat_callback, &info); - else - return true; - } + { + if (setjmp (info.env) == 0) + r_search (PCB->Data->rat_tree, &search_box, NULL, + LOCtoPVrat_callback, &info); + else + return true; + } PVList.Location++; } return false; @@ -782,7 +796,7 @@ LookupLOConnectionsToLOList (int flag, bool AndRats) { lineposition[i] = LineList[i].Location; polyposition[i] = PolygonList[i].Location; - arcposition[i] = ArcList[i].Location; + arcposition[i] = ArcList[i].Location; } for (i = 0; i < 2; i++) padposition[i] = PadList[i].Location; @@ -796,85 +810,90 @@ LookupLOConnectionsToLOList (int flag, bool AndRats) Cardinal *position; if (AndRats) - { - position = &ratposition; - for (; *position < RatList.Number; (*position)++) - { - group = RATLIST_ENTRY (*position)->group1; - if (LookupLOConnectionsToRatEnd - (&(RATLIST_ENTRY (*position)->Point1), group, flag)) - return (true); - group = RATLIST_ENTRY (*position)->group2; - if (LookupLOConnectionsToRatEnd - (&(RATLIST_ENTRY (*position)->Point2), group, flag)) - return (true); - } - } + { + position = &ratposition; + for (; *position < RatList.Number; (*position)++) + { + group = RATLIST_ENTRY (*position)->group1; + if (LookupLOConnectionsToRatEnd + (&(RATLIST_ENTRY (*position)->Point1), group, flag)) + return (true); + group = RATLIST_ENTRY (*position)->group2; + if (LookupLOConnectionsToRatEnd + (&(RATLIST_ENTRY (*position)->Point2), group, flag)) + return (true); + } + } /* loop over all layergroups */ for (group = 0; group < max_group; group++) - { - Cardinal entry; - - for (entry = 0; entry < PCB->LayerGroups.Number[group]; entry++) - { - layer = PCB->LayerGroups.Entries[group][entry]; - - /* be aware that the layer number equal max_copper_layer - * and max_copper_layer+1 have a special meaning for pads - */ - if (layer < max_copper_layer) - { - /* try all new lines */ - position = &lineposition[layer]; - for (; *position < LineList[layer].Number; (*position)++) - if (LookupLOConnectionsToLine - (LINELIST_ENTRY (layer, *position), group, flag, true, AndRats)) - return (true); - - /* try all new arcs */ - position = &arcposition[layer]; - for (; *position < ArcList[layer].Number; (*position)++) - if (LookupLOConnectionsToArc - (ARCLIST_ENTRY (layer, *position), group, flag, AndRats)) - return (true); - - /* try all new polygons */ - position = &polyposition[layer]; - for (; *position < PolygonList[layer].Number; (*position)++) - if (LookupLOConnectionsToPolygon - (POLYGONLIST_ENTRY (layer, *position), group, flag, AndRats)) - return (true); - } - else - { - /* try all new pads */ - layer -= max_copper_layer; - if (layer > 1) - { - Message (_("bad layer number %d max_copper_layer=%d in find.c\n"), - layer, max_copper_layer); - return false; - } - position = &padposition[layer]; - for (; *position < PadList[layer].Number; (*position)++) - if (LookupLOConnectionsToPad - (PADLIST_ENTRY (layer, *position), group, flag, AndRats)) - return (true); - } - } - } + { + Cardinal entry; + + for (entry = 0; entry < PCB->LayerGroups.Number[group]; entry++) + { + layer = PCB->LayerGroups.Entries[group][entry]; + + /* be aware that the layer number equal max_copper_layer + * and max_copper_layer+1 have a special meaning for pads + */ + if (layer < max_copper_layer) + { + /* try all new lines */ + position = &lineposition[layer]; + for (; *position < LineList[layer].Number; (*position)++) + if (LookupLOConnectionsToLine + (LINELIST_ENTRY (layer, *position), group, flag, true, + AndRats)) + return (true); + + /* try all new arcs */ + position = &arcposition[layer]; + for (; *position < ArcList[layer].Number; (*position)++) + if (LookupLOConnectionsToArc + (ARCLIST_ENTRY (layer, *position), group, flag, + AndRats)) + return (true); + + /* try all new polygons */ + position = &polyposition[layer]; + for (; *position < PolygonList[layer].Number; (*position)++) + if (LookupLOConnectionsToPolygon + (POLYGONLIST_ENTRY (layer, *position), group, flag, + AndRats)) + return (true); + } + else + { + /* try all new pads */ + layer -= max_copper_layer; + if (layer > 1) + { + Message (_ + ("bad layer number %d max_copper_layer=%d in find.c\n"), + layer, max_copper_layer); + return false; + } + position = &padposition[layer]; + for (; *position < PadList[layer].Number; (*position)++) + if (LookupLOConnectionsToPad + (PADLIST_ENTRY (layer, *position), group, flag, + AndRats)) + return (true); + } + } + } /* check if all lists are done; Later for-loops * may have changed the prior lists */ done = !AndRats || ratposition >= RatList.Number; done = done && padposition[0] >= PadList[0].Number && - padposition[1] >= PadList[1].Number; + padposition[1] >= PadList[1].Number; for (layer = 0; layer < max_copper_layer; layer++) - done = done && - lineposition[layer] >= LineList[layer].Number && - arcposition[layer] >= ArcList[layer].Number && - polyposition[layer] >= PolygonList[layer].Number; + done = done && + lineposition[layer] >= LineList[layer].Number && + arcposition[layer] >= ArcList[layer].Number && + polyposition[layer] >= PolygonList[layer].Number; } while (!done); return (false); @@ -889,16 +908,16 @@ pv_pv_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, pin) && PV_TOUCH_PV (i->pv, pin)) { if (TEST_FLAG (HOLEFLAG, pin) || TEST_FLAG (HOLEFLAG, i->pv)) - { - SET_FLAG (WARNFLAG, pin); - Settings.RatWarn = true; - if (pin->Element) - Message (_("WARNING: Hole too close to pin.\n")); - else - Message (_("WARNING: Hole too close to via.\n")); - } + { + SET_FLAG (WARNFLAG, pin); + Settings.RatWarn = true; + if (pin->Element) + Message (_("WARNING: Hole too close to pin.\n")); + else + Message (_("WARNING: Hole too close to via.\n")); + } else if (ADD_PV_TO_LIST (pin, i->flag)) - longjmp (i->env, 1); + longjmp (i->env, 1); } return 0; } @@ -922,18 +941,18 @@ LookupPVConnectionsToPVList (int flag) /* get pointer to data */ info.pv = PVLIST_ENTRY (PVList.Location); - search_box = expand_bounds ((BoxType *)info.pv); + search_box = expand_bounds ((BoxType *) info.pv); if (setjmp (info.env) == 0) - r_search (PCB->Data->via_tree, &search_box, NULL, - pv_pv_callback, &info); + r_search (PCB->Data->via_tree, &search_box, NULL, + pv_pv_callback, &info); else - return true; + return true; if (setjmp (info.env) == 0) - r_search (PCB->Data->pin_tree, &search_box, NULL, - pv_pv_callback, &info); + r_search (PCB->Data->pin_tree, &search_box, NULL, + pv_pv_callback, &info); else - return true; + return true; PVList.Location++; } PVList.Location = save_place; @@ -961,13 +980,13 @@ pv_line_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, pv) && PinLineIntersect (pv, i->line)) { if (TEST_FLAG (HOLEFLAG, pv)) - { - SET_FLAG (WARNFLAG, pv); - Settings.RatWarn = true; - Message (_("WARNING: Hole too close to line.\n")); - } + { + SET_FLAG (WARNFLAG, pv); + Settings.RatWarn = true; + Message (_("WARNING: Hole too close to line.\n")); + } else if (ADD_PV_TO_LIST (pv, i->flag)) - longjmp (i->env, 1); + longjmp (i->env, 1); } return 0; } @@ -981,13 +1000,13 @@ pv_pad_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, pv) && IS_PV_ON_PAD (pv, i->pad)) { if (TEST_FLAG (HOLEFLAG, pv)) - { - SET_FLAG (WARNFLAG, pv); - Settings.RatWarn = true; - Message (_("WARNING: Hole too close to pad.\n")); - } + { + SET_FLAG (WARNFLAG, pv); + Settings.RatWarn = true; + Message (_("WARNING: Hole too close to pad.\n")); + } else if (ADD_PV_TO_LIST (pv, i->flag)) - longjmp (i->env, 1); + longjmp (i->env, 1); } return 0; } @@ -1001,13 +1020,13 @@ pv_arc_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, pv) && IS_PV_ON_ARC (pv, i->arc)) { if (TEST_FLAG (HOLEFLAG, pv)) - { - SET_FLAG (WARNFLAG, pv); - Settings.RatWarn = true; - Message (_("WARNING: Hole touches arc.\n")); - } + { + SET_FLAG (WARNFLAG, pv); + Settings.RatWarn = true; + Message (_("WARNING: Hole touches arc.\n")); + } else if (ADD_PV_TO_LIST (pv, i->flag)) - longjmp (i->env, 1); + longjmp (i->env, 1); } return 0; } @@ -1020,34 +1039,33 @@ pv_poly_callback (const BoxType * b, void *cl) /* note that holes in polygons are ok, so they don't generate warnings. */ if (!TEST_FLAG (i->flag, pv) && !TEST_FLAG (HOLEFLAG, pv) && - (TEST_THERM (i->layer, pv) || - !TEST_FLAG (CLEARPOLYFLAG, i->polygon) || - !pv->Clearance)) + (TEST_THERM (i->layer, pv) || + !TEST_FLAG (CLEARPOLYFLAG, i->polygon) || !pv->Clearance)) { if (TEST_FLAG (SQUAREFLAG, pv)) - { - Coord x1, x2, y1, y2; - x1 = pv->X - (PIN_SIZE (pv) + 1 + Bloat) / 2; - x2 = pv->X + (PIN_SIZE (pv) + 1 + Bloat) / 2; - y1 = pv->Y - (PIN_SIZE (pv) + 1 + Bloat) / 2; - y2 = pv->Y + (PIN_SIZE (pv) + 1 + Bloat) / 2; - if (IsRectangleInPolygon (x1, y1, x2, y2, i->polygon) - && ADD_PV_TO_LIST (pv, i->flag)) - longjmp (i->env, 1); - } + { + Coord x1, x2, y1, y2; + x1 = pv->X - (PIN_SIZE (pv) + 1 + Bloat) / 2; + x2 = pv->X + (PIN_SIZE (pv) + 1 + Bloat) / 2; + y1 = pv->Y - (PIN_SIZE (pv) + 1 + Bloat) / 2; + y2 = pv->Y + (PIN_SIZE (pv) + 1 + Bloat) / 2; + if (IsRectangleInPolygon (x1, y1, x2, y2, i->polygon) + && ADD_PV_TO_LIST (pv, i->flag)) + longjmp (i->env, 1); + } else if (TEST_FLAG (OCTAGONFLAG, pv)) - { - POLYAREA *oct = OctagonPoly (pv->X, pv->Y, PIN_SIZE (pv) / 2); - if (isects (oct, i->polygon, true) && ADD_PV_TO_LIST (pv, i->flag)) - longjmp (i->env, 1); - } + { + POLYAREA *oct = OctagonPoly (pv->X, pv->Y, PIN_SIZE (pv) / 2); + if (isects (oct, i->polygon, true) && ADD_PV_TO_LIST (pv, i->flag)) + longjmp (i->env, 1); + } else - { - if (IsPointInPolygon - (pv->X, pv->Y, PIN_SIZE (pv) * 0.5 + Bloat, i->polygon) - && ADD_PV_TO_LIST (pv, i->flag)) - longjmp (i->env, 1); - } + { + if (IsPointInPolygon + (pv->X, pv->Y, PIN_SIZE (pv) * 0.5 + Bloat, i->polygon) + && ADD_PV_TO_LIST (pv, i->flag)) + longjmp (i->env, 1); + } } return 0; } @@ -1082,79 +1100,80 @@ LookupPVConnectionsToLOList (int flag, bool AndRats) LayerType *layer = LAYER_PTR (layer_no); if (layer->no_drc) - continue; + continue; /* do nothing if there are no PV's */ if (TotalP + TotalV == 0) - { - LineList[layer_no].Location = LineList[layer_no].Number; - ArcList[layer_no].Location = ArcList[layer_no].Number; - PolygonList[layer_no].Location = PolygonList[layer_no].Number; - continue; - } + { + LineList[layer_no].Location = LineList[layer_no].Number; + ArcList[layer_no].Location = ArcList[layer_no].Number; + PolygonList[layer_no].Location = PolygonList[layer_no].Number; + continue; + } /* check all lines */ while (LineList[layer_no].Location < LineList[layer_no].Number) - { - BoxType search_box; - - info.line = LINELIST_ENTRY (layer_no, LineList[layer_no].Location); - search_box = expand_bounds ((BoxType *)info.line); - - if (setjmp (info.env) == 0) - r_search (PCB->Data->via_tree, &search_box, NULL, - pv_line_callback, &info); - else - return true; - if (setjmp (info.env) == 0) - r_search (PCB->Data->pin_tree, &search_box, NULL, - pv_line_callback, &info); - else - return true; - LineList[layer_no].Location++; - } + { + BoxType search_box; + + info.line = LINELIST_ENTRY (layer_no, LineList[layer_no].Location); + search_box = expand_bounds ((BoxType *) info.line); + + if (setjmp (info.env) == 0) + r_search (PCB->Data->via_tree, &search_box, NULL, + pv_line_callback, &info); + else + return true; + if (setjmp (info.env) == 0) + r_search (PCB->Data->pin_tree, &search_box, NULL, + pv_line_callback, &info); + else + return true; + LineList[layer_no].Location++; + } /* check all arcs */ while (ArcList[layer_no].Location < ArcList[layer_no].Number) - { - BoxType search_box; - - info.arc = ARCLIST_ENTRY (layer_no, ArcList[layer_no].Location); - search_box = expand_bounds ((BoxType *)info.arc); - - if (setjmp (info.env) == 0) - r_search (PCB->Data->via_tree, &search_box, NULL, - pv_arc_callback, &info); - else - return true; - if (setjmp (info.env) == 0) - r_search (PCB->Data->pin_tree, &search_box, NULL, - pv_arc_callback, &info); - else - return true; - ArcList[layer_no].Location++; - } + { + BoxType search_box; + + info.arc = ARCLIST_ENTRY (layer_no, ArcList[layer_no].Location); + search_box = expand_bounds ((BoxType *) info.arc); + + if (setjmp (info.env) == 0) + r_search (PCB->Data->via_tree, &search_box, NULL, + pv_arc_callback, &info); + else + return true; + if (setjmp (info.env) == 0) + r_search (PCB->Data->pin_tree, &search_box, NULL, + pv_arc_callback, &info); + else + return true; + ArcList[layer_no].Location++; + } /* now all polygons */ info.layer = layer_no; while (PolygonList[layer_no].Location < PolygonList[layer_no].Number) - { - BoxType search_box; - - info.polygon = POLYGONLIST_ENTRY (layer_no, PolygonList[layer_no].Location); - search_box = expand_bounds ((BoxType *)info.polygon); - - if (setjmp (info.env) == 0) - r_search (PCB->Data->via_tree, &search_box, NULL, - pv_poly_callback, &info); - else - return true; - if (setjmp (info.env) == 0) - r_search (PCB->Data->pin_tree, &search_box, NULL, - pv_poly_callback, &info); - else - return true; - PolygonList[layer_no].Location++; - } + { + BoxType search_box; + + info.polygon = + POLYGONLIST_ENTRY (layer_no, PolygonList[layer_no].Location); + search_box = expand_bounds ((BoxType *) info.polygon); + + if (setjmp (info.env) == 0) + r_search (PCB->Data->via_tree, &search_box, NULL, + pv_poly_callback, &info); + else + return true; + if (setjmp (info.env) == 0) + r_search (PCB->Data->pin_tree, &search_box, NULL, + pv_poly_callback, &info); + else + return true; + PolygonList[layer_no].Location++; + } } /* loop over all pad-layers */ @@ -1162,33 +1181,33 @@ LookupPVConnectionsToLOList (int flag, bool AndRats) { /* do nothing if there are no PV's */ if (TotalP + TotalV == 0) - { - PadList[layer_no].Location = PadList[layer_no].Number; - continue; - } + { + PadList[layer_no].Location = PadList[layer_no].Number; + continue; + } /* check all pads; for a detailed description see * the handling of lines in this subroutine */ while (PadList[layer_no].Location < PadList[layer_no].Number) - { - BoxType search_box; - - info.pad = PADLIST_ENTRY (layer_no, PadList[layer_no].Location); - search_box = expand_bounds ((BoxType *)info.pad); - - if (setjmp (info.env) == 0) - r_search (PCB->Data->via_tree, &search_box, NULL, - pv_pad_callback, &info); - else - return true; - if (setjmp (info.env) == 0) - r_search (PCB->Data->pin_tree, &search_box, NULL, - pv_pad_callback, &info); - else - return true; - PadList[layer_no].Location++; - } + { + BoxType search_box; + + info.pad = PADLIST_ENTRY (layer_no, PadList[layer_no].Location); + search_box = expand_bounds ((BoxType *) info.pad); + + if (setjmp (info.env) == 0) + r_search (PCB->Data->via_tree, &search_box, NULL, + pv_pad_callback, &info); + else + return true; + if (setjmp (info.env) == 0) + r_search (PCB->Data->pin_tree, &search_box, NULL, + pv_pad_callback, &info); + else + return true; + PadList[layer_no].Location++; + } } /* do nothing if there are no PV's */ @@ -1199,39 +1218,39 @@ LookupPVConnectionsToLOList (int flag, bool AndRats) if (AndRats) { while (RatList.Location < RatList.Number) - { - info.rat = RATLIST_ENTRY (RatList.Location); - r_search_pt (PCB->Data->via_tree, & info.rat->Point1, 1, NULL, - pv_rat_callback, &info); - r_search_pt (PCB->Data->via_tree, & info.rat->Point2, 1, NULL, - pv_rat_callback, &info); - r_search_pt (PCB->Data->pin_tree, & info.rat->Point1, 1, NULL, - pv_rat_callback, &info); - r_search_pt (PCB->Data->pin_tree, & info.rat->Point2, 1, NULL, - pv_rat_callback, &info); - - RatList.Location++; - } + { + info.rat = RATLIST_ENTRY (RatList.Location); + r_search_pt (PCB->Data->via_tree, &info.rat->Point1, 1, NULL, + pv_rat_callback, &info); + r_search_pt (PCB->Data->via_tree, &info.rat->Point2, 1, NULL, + pv_rat_callback, &info); + r_search_pt (PCB->Data->pin_tree, &info.rat->Point1, 1, NULL, + pv_rat_callback, &info); + r_search_pt (PCB->Data->pin_tree, &info.rat->Point2, 1, NULL, + pv_rat_callback, &info); + + RatList.Location++; + } } return (false); } /* reduce arc start angle and delta to 0..360 */ static void -normalize_angles (Angle *sa, Angle *d) +normalize_angles (Angle * sa, Angle * d) { if (*d < 0) { *sa += *d; - *d = - *d; + *d = -*d; } - if (*d > 360) /* full circle */ + if (*d > 360) /* full circle */ *d = 360; *sa = NormalizeAngle (*sa); } static int -radius_crosses_arc (double x, double y, ArcType *arc) +radius_crosses_arc (double x, double y, ArcType * arc) { double alpha = atan2 (y - arc->Y, -x + arc->X) * RAD_TO_DEG; Angle sa = arc->StartAngle, d = arc->Delta; @@ -1245,13 +1264,14 @@ radius_crosses_arc (double x, double y, ArcType *arc) } static void -get_arc_ends (Coord *box, ArcType *arc) +get_arc_ends (Coord * box, ArcType * arc) { - box[0] = arc->X - arc->Width * cos (M180 * arc->StartAngle); + box[0] = arc->X - arc->Width * cos (M180 * arc->StartAngle); box[1] = arc->Y + arc->Height * sin (M180 * arc->StartAngle); - box[2] = arc->X - arc->Width * cos (M180 * (arc->StartAngle + arc->Delta)); + box[2] = arc->X - arc->Width * cos (M180 * (arc->StartAngle + arc->Delta)); box[3] = arc->Y + arc->Height * sin (M180 * (arc->StartAngle + arc->Delta)); } + /* --------------------------------------------------------------------------- * check if two arcs intersect * first we check for circle intersections, @@ -1278,13 +1298,13 @@ get_arc_ends (Coord *box, ArcType *arc) * */ static bool -ArcArcIntersect (ArcType *Arc1, ArcType *Arc2) +ArcArcIntersect (ArcType * Arc1, ArcType * Arc2) { double x, y, dx, dy, r1, r2, a, d, l, t, t1, t2, dl; Coord pdx, pdy; Coord box[8]; - t = 0.5 * Arc1->Thickness + Bloat; + t = 0.5 * Arc1->Thickness + Bloat; t2 = 0.5 * Arc2->Thickness; t1 = t2 + Bloat; @@ -1308,10 +1328,10 @@ ArcArcIntersect (ArcType *Arc1, ArcType *Arc2) if (dl < 0.5) { if ((Arc1->Width - t >= Arc2->Width - t2 - && Arc1->Width - t <= Arc2->Width + t2) - || (Arc1->Width + t >= Arc2->Width - t2 - && Arc1->Width + t <= Arc2->Width + t2)) - { + && Arc1->Width - t <= Arc2->Width + t2) + || (Arc1->Width + t >= Arc2->Width - t2 + && Arc1->Width + t <= Arc2->Width + t2)) + { Angle sa1 = Arc1->StartAngle, d1 = Arc1->Delta; Angle sa2 = Arc2->StartAngle, d2 = Arc2->Delta; /* NB the endpoints have already been checked, @@ -1321,12 +1341,12 @@ ArcArcIntersect (ArcType *Arc1, ArcType *Arc2) normalize_angles (&sa2, &d2); /* sa1 == sa2 was caught when checking endpoints */ if (sa1 > sa2) - if (sa1 < sa2 + d2 || sa1 + d1 - 360 > sa2) - return true; + if (sa1 < sa2 + d2 || sa1 + d1 - 360 > sa2) + return true; if (sa2 > sa1) if (sa2 < sa1 + d1 || sa2 + d2 - 360 > sa1) - return true; - } + return true; + } return false; } r1 = Arc1->Width; @@ -1337,22 +1357,22 @@ ArcArcIntersect (ArcType *Arc1, ArcType *Arc2) /* check the nearest to the other arc's center point */ dx = pdx * r1 / dl; dy = pdy * r1 / dl; - if (dl + r1 < r2) /* Arc1 inside Arc2 */ + if (dl + r1 < r2) /* Arc1 inside Arc2 */ { - dx = - dx; - dy = - dy; + dx = -dx; + dy = -dy; } if (radius_crosses_arc (Arc1->X + dx, Arc1->Y + dy, Arc1) && IsPointOnArc (Arc1->X + dx, Arc1->Y + dy, t, Arc2)) return true; - dx = - pdx * r2 / dl; - dy = - pdy * r2 / dl; - if (dl + r2 < r1) /* Arc2 inside Arc1 */ + dx = -pdx * r2 / dl; + dy = -pdy * r2 / dl; + if (dl + r2 < r1) /* Arc2 inside Arc1 */ { - dx = - dx; - dy = - dy; + dx = -dx; + dy = -dy; } if (radius_crosses_arc (Arc2->X + dx, Arc2->Y + dy, Arc2) @@ -1397,7 +1417,7 @@ ArcArcIntersect (ArcType *Arc1, ArcType *Arc2) * Tests if point is same as line end point */ static bool -IsRatPointOnLineEnd (PointType *Point, LineType *Line) +IsRatPointOnLineEnd (PointType * Point, LineType * Line) { if ((Point->X == Line->Point1.X && Point->Y == Line->Point1.Y) @@ -1406,28 +1426,34 @@ IsRatPointOnLineEnd (PointType *Point, LineType *Line) return (false); } -static void -form_slanted_rectangle (PointType p[4], LineType *l) +static void +form_slanted_rectangle (PointType p[4], LineType * l) /* writes vertices of a squared line */ { - double dwx = 0, dwy = 0; - if (l->Point1.Y == l->Point2.Y) - dwx = l->Thickness / 2.0; - else if (l->Point1.X == l->Point2.X) - dwy = l->Thickness / 2.0; - else - { - Coord dX = l->Point2.X - l->Point1.X; - Coord dY = l->Point2.Y - l->Point1.Y; - double r = Distance (l->Point1.X, l->Point1.Y, l->Point2.X, l->Point2.Y); - dwx = l->Thickness / 2.0 / r * dX; - dwy = l->Thickness / 2.0 / r * dY; - } - p[0].X = l->Point1.X - dwx + dwy; p[0].Y = l->Point1.Y - dwy - dwx; - p[1].X = l->Point1.X - dwx - dwy; p[1].Y = l->Point1.Y - dwy + dwx; - p[2].X = l->Point2.X + dwx - dwy; p[2].Y = l->Point2.Y + dwy + dwx; - p[3].X = l->Point2.X + dwx + dwy; p[3].Y = l->Point2.Y + dwy - dwx; + double dwx = 0, dwy = 0; + if (l->Point1.Y == l->Point2.Y) + dwx = l->Thickness / 2.0; + else if (l->Point1.X == l->Point2.X) + dwy = l->Thickness / 2.0; + else + { + Coord dX = l->Point2.X - l->Point1.X; + Coord dY = l->Point2.Y - l->Point1.Y; + double r = + Distance (l->Point1.X, l->Point1.Y, l->Point2.X, l->Point2.Y); + dwx = l->Thickness / 2.0 / r * dX; + dwy = l->Thickness / 2.0 / r * dY; + } + p[0].X = l->Point1.X - dwx + dwy; + p[0].Y = l->Point1.Y - dwy - dwx; + p[1].X = l->Point1.X - dwx - dwy; + p[1].Y = l->Point1.Y - dwy + dwx; + p[2].X = l->Point2.X + dwx - dwy; + p[2].Y = l->Point2.Y + dwy + dwx; + p[3].X = l->Point2.X + dwx + dwy; + p[3].Y = l->Point2.Y + dwy - dwx; } + /* --------------------------------------------------------------------------- * checks if two lines intersect * from news FAQ: @@ -1484,19 +1510,18 @@ form_slanted_rectangle (PointType p[4], LineType *l) * */ bool -LineLineIntersect (LineType *Line1, LineType *Line2) +LineLineIntersect (LineType * Line1, LineType * Line2) { double s, r; - double line1_dx, line1_dy, line2_dx, line2_dy, - point1_dx, point1_dy; - if (TEST_FLAG (SQUAREFLAG, Line1))/* pretty reckless recursion */ + double line1_dx, line1_dy, line2_dx, line2_dy, point1_dx, point1_dy; + if (TEST_FLAG (SQUAREFLAG, Line1)) /* pretty reckless recursion */ { PointType p[4]; form_slanted_rectangle (p, Line1); return IsLineInQuadrangle (p, Line2); } /* here come only round Line1 because IsLineInQuadrangle() - calls LineLineIntersect() with first argument rounded*/ + calls LineLineIntersect() with first argument rounded */ if (TEST_FLAG (SQUAREFLAG, Line2)) { PointType p[4]; @@ -1510,17 +1535,17 @@ LineLineIntersect (LineType *Line1, LineType *Line2) * thick lines touch, and ensures that the dx/dy business * below does not cause a divide-by-zero. */ if (IsPointInPad (Line2->Point1.X, Line2->Point1.Y, - MAX (Line2->Thickness / 2 + Bloat, 0), - (PadType *) Line1) - || IsPointInPad (Line2->Point2.X, Line2->Point2.Y, - MAX (Line2->Thickness / 2 + Bloat, 0), - (PadType *) Line1) - || IsPointInPad (Line1->Point1.X, Line1->Point1.Y, - MAX (Line1->Thickness / 2 + Bloat, 0), - (PadType *) Line2) - || IsPointInPad (Line1->Point2.X, Line1->Point2.Y, - MAX (Line1->Thickness / 2 + Bloat, 0), - (PadType *) Line2)) + MAX (Line2->Thickness / 2 + Bloat, 0), + (PadType *) Line1) + || IsPointInPad (Line2->Point2.X, Line2->Point2.Y, + MAX (Line2->Thickness / 2 + Bloat, 0), + (PadType *) Line1) + || IsPointInPad (Line1->Point1.X, Line1->Point1.Y, + MAX (Line1->Thickness / 2 + Bloat, 0), + (PadType *) Line2) + || IsPointInPad (Line1->Point2.X, Line1->Point2.Y, + MAX (Line1->Thickness / 2 + Bloat, 0), + (PadType *) Line2)) return true; /* setup some constants */ @@ -1533,8 +1558,7 @@ LineLineIntersect (LineType *Line1, LineType *Line2) /* If either line is a point, we have failed already, since the * endpoint check above will have caught an "intersection". */ - if ((line1_dx == 0 && line1_dy == 0) - || (line2_dx == 0 && line2_dy == 0)) + if ((line1_dx == 0 && line1_dy == 0) || (line2_dx == 0 && line2_dy == 0)) return false; /* set s to cross product of Line1 and the line @@ -1593,7 +1617,7 @@ LineLineIntersect (LineType *Line1, LineType *Line2) * The end points are hell so they are checked individually */ bool -LineArcIntersect (LineType *Line, ArcType *Arc) +LineArcIntersect (LineType * Line, ArcType * Arc) { double dx, dy, dx1, dy1, l, d, r, r2, Radius; BoxType *box; @@ -1631,20 +1655,22 @@ LineArcIntersect (LineType *Line, ArcType *Arc) r = (Radius + r2) / l; if (r >= 0 && r <= 1 && IsPointOnArc (Line->Point1.X + r * dx, - Line->Point1.Y + r * dy, - MAX (0.5 * Line->Thickness + Bloat, 0.0), Arc)) + Line->Point1.Y + r * dy, + MAX (0.5 * Line->Thickness + Bloat, 0.0), Arc)) return (true); r = (Radius - r2) / l; if (r >= 0 && r <= 1 && IsPointOnArc (Line->Point1.X + r * dx, - Line->Point1.Y + r * dy, - MAX (0.5 * Line->Thickness + Bloat, 0.0), Arc)) + Line->Point1.Y + r * dy, + MAX (0.5 * Line->Thickness + Bloat, 0.0), Arc)) return (true); /* check arc end points */ box = GetArcEnds (Arc); - if (IsPointInPad (box->X1, box->Y1, Arc->Thickness * 0.5 + Bloat, (PadType *)Line)) + if (IsPointInPad + (box->X1, box->Y1, Arc->Thickness * 0.5 + Bloat, (PadType *) Line)) return true; - if (IsPointInPad (box->X2, box->Y2, Arc->Thickness * 0.5 + Bloat, (PadType *)Line)) + if (IsPointInPad + (box->X2, box->Y2, Arc->Thickness * 0.5 + Bloat, (PadType *) Line)) return true; return false; } @@ -1658,7 +1684,7 @@ LOCtoArcLine_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, line) && LineArcIntersect (line, i->arc)) { if (ADD_LINE_TO_LIST (i->layer, line, i->flag)) - longjmp (i->env, 1); + longjmp (i->env, 1); } return 0; } @@ -1674,7 +1700,7 @@ LOCtoArcArc_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, arc) && ArcArcIntersect (i->arc, arc)) { if (ADD_ARC_TO_LIST (i->layer, arc, i->flag)) - longjmp (i->env, 1); + longjmp (i->env, 1); } return 0; } @@ -1687,7 +1713,8 @@ LOCtoArcPad_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, pad) && i->layer == (TEST_FLAG (ONSOLDERFLAG, pad) ? SOLDER_LAYER : COMPONENT_LAYER) - && ArcPadIntersect (i->arc, pad) && ADD_PAD_TO_LIST (i->layer, pad, i->flag)) + && ArcPadIntersect (i->arc, pad) + && ADD_PAD_TO_LIST (i->layer, pad, i->flag)) longjmp (i->env, 1); return 0; } @@ -1700,7 +1727,8 @@ LOCtoArcPad_callback (const BoxType * b, void *cl) * Xij means Xj at arc i */ static bool -LookupLOConnectionsToArc (ArcType *Arc, Cardinal LayerGroup, int flag, bool AndRats) +LookupLOConnectionsToArc (ArcType * Arc, Cardinal LayerGroup, int flag, + bool AndRats) { Cardinal entry; struct lo_info info; @@ -1708,7 +1736,7 @@ LookupLOConnectionsToArc (ArcType *Arc, Cardinal LayerGroup, int flag, bool AndR info.flag = flag; info.arc = Arc; - search_box = expand_bounds ((BoxType *)info.arc); + search_box = expand_bounds ((BoxType *) info.arc); /* loop over all layers of the group */ for (entry = 0; entry < PCB->LayerGroups.Number[LayerGroup]; entry++) @@ -1722,39 +1750,39 @@ LookupLOConnectionsToArc (ArcType *Arc, Cardinal LayerGroup, int flag, bool AndR /* handle normal layers */ if (layer_no < max_copper_layer) - { - info.layer = layer_no; - /* add arcs */ - if (setjmp (info.env) == 0) - r_search (layer->line_tree, &search_box, - NULL, LOCtoArcLine_callback, &info); - else - return true; - - if (setjmp (info.env) == 0) - r_search (layer->arc_tree, &search_box, - NULL, LOCtoArcArc_callback, &info); - else - return true; - - /* now check all polygons */ - for (i = layer->Polygon; i != NULL; i = g_list_next (i)) - { - PolygonType *polygon = i->data; - if (!TEST_FLAG (flag, polygon) && IsArcInPolygon (Arc, polygon) - && ADD_POLYGON_TO_LIST (layer_no, polygon, flag)) - return true; - } - } + { + info.layer = layer_no; + /* add arcs */ + if (setjmp (info.env) == 0) + r_search (layer->line_tree, &search_box, + NULL, LOCtoArcLine_callback, &info); + else + return true; + + if (setjmp (info.env) == 0) + r_search (layer->arc_tree, &search_box, + NULL, LOCtoArcArc_callback, &info); + else + return true; + + /* now check all polygons */ + for (i = layer->Polygon; i != NULL; i = g_list_next (i)) + { + PolygonType *polygon = i->data; + if (!TEST_FLAG (flag, polygon) && IsArcInPolygon (Arc, polygon) + && ADD_POLYGON_TO_LIST (layer_no, polygon, flag)) + return true; + } + } else - { - info.layer = layer_no - max_copper_layer; - if (setjmp (info.env) == 0) - r_search (PCB->Data->pad_tree, &search_box, NULL, - LOCtoArcPad_callback, &info); - else - return true; - } + { + info.layer = layer_no - max_copper_layer; + if (setjmp (info.env) == 0) + r_search (PCB->Data->pad_tree, &search_box, NULL, + LOCtoArcPad_callback, &info); + else + return true; + } } return (false); } @@ -1768,7 +1796,7 @@ LOCtoLineLine_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, line) && LineLineIntersect (i->line, line)) { if (ADD_LINE_TO_LIST (i->layer, line, i->flag)) - longjmp (i->env, 1); + longjmp (i->env, 1); } return 0; } @@ -1784,7 +1812,7 @@ LOCtoLineArc_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, arc) && LineArcIntersect (i->line, arc)) { if (ADD_ARC_TO_LIST (i->layer, arc, i->flag)) - longjmp (i->env, 1); + longjmp (i->env, 1); } return 0; } @@ -1798,17 +1826,17 @@ LOCtoLineRat_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, rat)) { if ((rat->group1 == i->layer) - && IsRatPointOnLineEnd (&rat->Point1, i->line)) - { - if (ADD_RAT_TO_LIST (rat, i->flag)) - longjmp (i->env, 1); - } + && IsRatPointOnLineEnd (&rat->Point1, i->line)) + { + if (ADD_RAT_TO_LIST (rat, i->flag)) + longjmp (i->env, 1); + } else if ((rat->group2 == i->layer) - && IsRatPointOnLineEnd (&rat->Point2, i->line)) - { - if (ADD_RAT_TO_LIST (rat, i->flag)) - longjmp (i->env, 1); - } + && IsRatPointOnLineEnd (&rat->Point2, i->line)) + { + if (ADD_RAT_TO_LIST (rat, i->flag)) + longjmp (i->env, 1); + } } return 0; } @@ -1821,7 +1849,8 @@ LOCtoLinePad_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, pad) && i->layer == (TEST_FLAG (ONSOLDERFLAG, pad) ? SOLDER_LAYER : COMPONENT_LAYER) - && LinePadIntersect (i->line, pad) && ADD_PAD_TO_LIST (i->layer, pad, i->flag)) + && LinePadIntersect (i->line, pad) + && ADD_PAD_TO_LIST (i->layer, pad, i->flag)) longjmp (i->env, 1); return 0; } @@ -1834,8 +1863,8 @@ LOCtoLinePad_callback (const BoxType * b, void *cl) * Xij means Xj at line i */ static bool -LookupLOConnectionsToLine (LineType *Line, Cardinal LayerGroup, - int flag, bool PolysTo, bool AndRats) +LookupLOConnectionsToLine (LineType * Line, Cardinal LayerGroup, + int flag, bool PolysTo, bool AndRats) { Cardinal entry; struct lo_info info; @@ -1844,16 +1873,16 @@ LookupLOConnectionsToLine (LineType *Line, Cardinal LayerGroup, info.flag = flag; info.layer = LayerGroup; info.line = Line; - search_box = expand_bounds ((BoxType *)info.line); + search_box = expand_bounds ((BoxType *) info.line); if (AndRats) { /* add the new rat lines */ if (setjmp (info.env) == 0) - r_search (PCB->Data->rat_tree, &search_box, NULL, - LOCtoLineRat_callback, &info); + r_search (PCB->Data->rat_tree, &search_box, NULL, + LOCtoLineRat_callback, &info); else - return true; + return true; } /* loop over all layers of the group */ @@ -1867,43 +1896,44 @@ LookupLOConnectionsToLine (LineType *Line, Cardinal LayerGroup, /* handle normal layers */ if (layer_no < max_copper_layer) - { - info.layer = layer_no; - /* add lines */ - if (setjmp (info.env) == 0) - r_search (layer->line_tree, &search_box, - NULL, LOCtoLineLine_callback, &info); - else - return true; - /* add arcs */ - if (setjmp (info.env) == 0) - r_search (layer->arc_tree, &search_box, - NULL, LOCtoLineArc_callback, &info); - else - return true; - /* now check all polygons */ - if (PolysTo) - { - GList *i; - for (i = layer->Polygon; i != NULL; i = g_list_next (i)) - { - PolygonType *polygon = i->data; - if (!TEST_FLAG (flag, polygon) && IsLineInPolygon (Line, polygon) - && ADD_POLYGON_TO_LIST (layer_no, polygon, flag)) - return true; - } - } - } + { + info.layer = layer_no; + /* add lines */ + if (setjmp (info.env) == 0) + r_search (layer->line_tree, &search_box, + NULL, LOCtoLineLine_callback, &info); + else + return true; + /* add arcs */ + if (setjmp (info.env) == 0) + r_search (layer->arc_tree, &search_box, + NULL, LOCtoLineArc_callback, &info); + else + return true; + /* now check all polygons */ + if (PolysTo) + { + GList *i; + for (i = layer->Polygon; i != NULL; i = g_list_next (i)) + { + PolygonType *polygon = i->data; + if (!TEST_FLAG (flag, polygon) + && IsLineInPolygon (Line, polygon) + && ADD_POLYGON_TO_LIST (layer_no, polygon, flag)) + return true; + } + } + } else - { - /* handle special 'pad' layers */ - info.layer = layer_no - max_copper_layer; - if (setjmp (info.env) == 0) - r_search (PCB->Data->pad_tree, &search_box, NULL, - LOCtoLinePad_callback, &info); - else - return true; - } + { + /* handle special 'pad' layers */ + info.layer = layer_no - max_copper_layer; + if (setjmp (info.env) == 0) + r_search (PCB->Data->pad_tree, &search_box, NULL, + LOCtoLinePad_callback, &info); + else + return true; + } } return (false); } @@ -1924,14 +1954,15 @@ LOCtoRat_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, line) && ((line->Point1.X == i->Point->X && - line->Point1.Y == i->Point->Y) || + line->Point1.Y == i->Point->Y) || (line->Point2.X == i->Point->X && line->Point2.Y == i->Point->Y))) { if (ADD_LINE_TO_LIST (i->layer, line, i->flag)) - longjmp (i->env, 1); + longjmp (i->env, 1); } return 0; } + static int PolygonToRat_callback (const BoxType * b, void *cl) { @@ -1943,7 +1974,7 @@ PolygonToRat_callback (const BoxType * b, void *cl) (i->Point->Y == polygon->Clipped->contours->head.point[1])) { if (ADD_POLYGON_TO_LIST (i->layer, polygon, i->flag)) - longjmp (i->env, 1); + longjmp (i->env, 1); } return 0; } @@ -1955,11 +1986,11 @@ LOCtoPad_callback (const BoxType * b, void *cl) struct rat_info *i = (struct rat_info *) cl; if (!TEST_FLAG (i->flag, pad) && i->layer == - (TEST_FLAG (ONSOLDERFLAG, pad) ? SOLDER_LAYER : COMPONENT_LAYER) && + (TEST_FLAG (ONSOLDERFLAG, pad) ? SOLDER_LAYER : COMPONENT_LAYER) && ((pad->Point1.X == i->Point->X && pad->Point1.Y == i->Point->Y) || (pad->Point2.X == i->Point->X && pad->Point2.Y == i->Point->Y) || ((pad->Point1.X + pad->Point2.X) / 2 == i->Point->X && - (pad->Point1.Y + pad->Point2.Y) / 2 == i->Point->Y)) && + (pad->Point1.Y + pad->Point2.Y) / 2 == i->Point->Y)) && ADD_PAD_TO_LIST (i->layer, pad, i->flag)) longjmp (i->env, 1); return 0; @@ -1973,7 +2004,7 @@ LOCtoPad_callback (const BoxType * b, void *cl) * Xij means Xj at line i */ static bool -LookupLOConnectionsToRatEnd (PointType *Point, Cardinal LayerGroup, int flag) +LookupLOConnectionsToRatEnd (PointType * Point, Cardinal LayerGroup, int flag) { Cardinal entry; struct rat_info info; @@ -1994,27 +2025,27 @@ LookupLOConnectionsToRatEnd (PointType *Point, Cardinal LayerGroup, int flag) */ if (layer_no < max_copper_layer) - { - info.layer = layer_no; - if (setjmp (info.env) == 0) - r_search_pt (layer->line_tree, Point, 1, NULL, - LOCtoRat_callback, &info); - else - return true; - if (setjmp (info.env) == 0) - r_search_pt (layer->polygon_tree, Point, 1, - NULL, PolygonToRat_callback, &info); - } + { + info.layer = layer_no; + if (setjmp (info.env) == 0) + r_search_pt (layer->line_tree, Point, 1, NULL, + LOCtoRat_callback, &info); + else + return true; + if (setjmp (info.env) == 0) + r_search_pt (layer->polygon_tree, Point, 1, + NULL, PolygonToRat_callback, &info); + } else - { - /* handle special 'pad' layers */ - info.layer = layer_no - max_copper_layer; - if (setjmp (info.env) == 0) - r_search_pt (PCB->Data->pad_tree, Point, 1, NULL, - LOCtoPad_callback, &info); - else - return true; - } + { + /* handle special 'pad' layers */ + info.layer = layer_no - max_copper_layer; + if (setjmp (info.env) == 0) + r_search_pt (PCB->Data->pad_tree, Point, 1, NULL, + LOCtoPad_callback, &info); + else + return true; + } } return (false); } @@ -2028,7 +2059,7 @@ LOCtoPadLine_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, line) && LinePadIntersect (line, i->pad)) { if (ADD_LINE_TO_LIST (i->layer, line, i->flag)) - longjmp (i->env, 1); + longjmp (i->env, 1); } return 0; } @@ -2044,7 +2075,7 @@ LOCtoPadArc_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, arc) && ArcPadIntersect (arc, i->pad)) { if (ADD_ARC_TO_LIST (i->layer, arc, i->flag)) - longjmp (i->env, 1); + longjmp (i->env, 1); } return 0; } @@ -2060,8 +2091,8 @@ LOCtoPadPoly_callback (const BoxType * b, void *cl) (!TEST_FLAG (CLEARPOLYFLAG, polygon) || !i->pad->Clearance)) { if (IsPadInPolygon (i->pad, polygon) && - ADD_POLYGON_TO_LIST (i->layer, polygon, i->flag)) - longjmp (i->env, 1); + ADD_POLYGON_TO_LIST (i->layer, polygon, i->flag)) + longjmp (i->env, 1); } return 0; } @@ -2075,23 +2106,29 @@ LOCtoPadRat_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, rat)) { if (rat->group1 == i->layer && - ((rat->Point1.X == i->pad->Point1.X && rat->Point1.Y == i->pad->Point1.Y) || - (rat->Point1.X == i->pad->Point2.X && rat->Point1.Y == i->pad->Point2.Y) || - (rat->Point1.X == (i->pad->Point1.X + i->pad->Point2.X) / 2 && - rat->Point1.Y == (i->pad->Point1.Y + i->pad->Point2.Y) / 2))) - { - if (ADD_RAT_TO_LIST (rat, i->flag)) - longjmp (i->env, 1); - } + ((rat->Point1.X == i->pad->Point1.X + && rat->Point1.Y == i->pad->Point1.Y) + || (rat->Point1.X == i->pad->Point2.X + && rat->Point1.Y == i->pad->Point2.Y) + || (rat->Point1.X == (i->pad->Point1.X + i->pad->Point2.X) / 2 + && rat->Point1.Y == + (i->pad->Point1.Y + i->pad->Point2.Y) / 2))) + { + if (ADD_RAT_TO_LIST (rat, i->flag)) + longjmp (i->env, 1); + } else if (rat->group2 == i->layer && - ((rat->Point2.X == i->pad->Point1.X && rat->Point2.Y == i->pad->Point1.Y) || - (rat->Point2.X == i->pad->Point2.X && rat->Point2.Y == i->pad->Point2.Y) || - (rat->Point2.X == (i->pad->Point1.X + i->pad->Point2.X) / 2 && - rat->Point2.Y == (i->pad->Point1.Y + i->pad->Point2.Y) / 2))) - { - if (ADD_RAT_TO_LIST (rat, i->flag)) - longjmp (i->env, 1); - } + ((rat->Point2.X == i->pad->Point1.X + && rat->Point2.Y == i->pad->Point1.Y) + || (rat->Point2.X == i->pad->Point2.X + && rat->Point2.Y == i->pad->Point2.Y) + || (rat->Point2.X == (i->pad->Point1.X + i->pad->Point2.X) / 2 + && rat->Point2.Y == + (i->pad->Point1.Y + i->pad->Point2.Y) / 2))) + { + if (ADD_RAT_TO_LIST (rat, i->flag)) + longjmp (i->env, 1); + } } return 0; } @@ -2104,7 +2141,8 @@ LOCtoPadPad_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, pad) && i->layer == (TEST_FLAG (ONSOLDERFLAG, pad) ? SOLDER_LAYER : COMPONENT_LAYER) - && PadPadIntersect (pad, i->pad) && ADD_PAD_TO_LIST (i->layer, pad, i->flag)) + && PadPadIntersect (pad, i->pad) + && ADD_PAD_TO_LIST (i->layer, pad, i->flag)) longjmp (i->env, 1); return 0; } @@ -2114,18 +2152,20 @@ LOCtoPadPad_callback (const BoxType * b, void *cl) * layergroup. All found connections are added to the list */ static bool -LookupLOConnectionsToPad (PadType *Pad, Cardinal LayerGroup, int flag, bool AndRats) +LookupLOConnectionsToPad (PadType * Pad, Cardinal LayerGroup, int flag, + bool AndRats) { Cardinal entry; struct lo_info info; BoxType search_box; if (!TEST_FLAG (SQUAREFLAG, Pad)) - return (LookupLOConnectionsToLine ((LineType *) Pad, LayerGroup, flag, false, AndRats)); + return (LookupLOConnectionsToLine + ((LineType *) Pad, LayerGroup, flag, false, AndRats)); info.flag = flag; info.pad = Pad; - search_box = expand_bounds ((BoxType *)info.pad); + search_box = expand_bounds ((BoxType *) info.pad); /* add the new rat lines */ info.layer = LayerGroup; @@ -2133,10 +2173,10 @@ LookupLOConnectionsToPad (PadType *Pad, Cardinal LayerGroup, int flag, bool AndR if (AndRats) { if (setjmp (info.env) == 0) - r_search (PCB->Data->rat_tree, &search_box, NULL, - LOCtoPadRat_callback, &info); + r_search (PCB->Data->rat_tree, &search_box, NULL, + LOCtoPadRat_callback, &info); else - return true; + return true; } /* loop over all layers of the group */ @@ -2149,37 +2189,37 @@ LookupLOConnectionsToPad (PadType *Pad, Cardinal LayerGroup, int flag, bool AndR layer = LAYER_PTR (layer_no); /* handle normal layers */ if (layer_no < max_copper_layer) - { - info.layer = layer_no; - /* add lines */ - if (setjmp (info.env) == 0) - r_search (layer->line_tree, &search_box, - NULL, LOCtoPadLine_callback, &info); - else - return true; - /* add arcs */ - if (setjmp (info.env) == 0) - r_search (layer->arc_tree, &search_box, - NULL, LOCtoPadArc_callback, &info); - else - return true; - /* add polygons */ - if (setjmp (info.env) == 0) - r_search (layer->polygon_tree, &search_box, - NULL, LOCtoPadPoly_callback, &info); - else - return true; - } + { + info.layer = layer_no; + /* add lines */ + if (setjmp (info.env) == 0) + r_search (layer->line_tree, &search_box, + NULL, LOCtoPadLine_callback, &info); + else + return true; + /* add arcs */ + if (setjmp (info.env) == 0) + r_search (layer->arc_tree, &search_box, + NULL, LOCtoPadArc_callback, &info); + else + return true; + /* add polygons */ + if (setjmp (info.env) == 0) + r_search (layer->polygon_tree, &search_box, + NULL, LOCtoPadPoly_callback, &info); + else + return true; + } else - { - /* handle special 'pad' layers */ - info.layer = layer_no - max_copper_layer; - if (setjmp (info.env) == 0) - r_search (PCB->Data->pad_tree, &search_box, NULL, - LOCtoPadPad_callback, &info); - else - return true; - } + { + /* handle special 'pad' layers */ + info.layer = layer_no - max_copper_layer; + if (setjmp (info.env) == 0) + r_search (PCB->Data->pad_tree, &search_box, NULL, + LOCtoPadPad_callback, &info); + else + return true; + } } return (false); @@ -2194,7 +2234,7 @@ LOCtoPolyLine_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, line) && IsLineInPolygon (line, i->polygon)) { if (ADD_LINE_TO_LIST (i->layer, line, i->flag)) - longjmp (i->env, 1); + longjmp (i->env, 1); } return 0; } @@ -2210,7 +2250,7 @@ LOCtoPolyArc_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, arc) && IsArcInPolygon (arc, i->polygon)) { if (ADD_ARC_TO_LIST (i->layer, arc, i->flag)) - longjmp (i->env, 1); + longjmp (i->env, 1); } return 0; } @@ -2226,7 +2266,7 @@ LOCtoPolyPad_callback (const BoxType * b, void *cl) && IsPadInPolygon (pad, i->polygon)) { if (ADD_PAD_TO_LIST (i->layer, pad, i->flag)) - longjmp (i->env, 1); + longjmp (i->env, 1); } return 0; } @@ -2240,13 +2280,13 @@ LOCtoPolyRat_callback (const BoxType * b, void *cl) if (!TEST_FLAG (i->flag, rat)) { if ((rat->Point1.X == (i->polygon->Clipped->contours->head.point[0]) && - rat->Point1.Y == (i->polygon->Clipped->contours->head.point[1]) && - rat->group1 == i->layer) || - (rat->Point2.X == (i->polygon->Clipped->contours->head.point[0]) && - rat->Point2.Y == (i->polygon->Clipped->contours->head.point[1]) && - rat->group2 == i->layer)) - if (ADD_RAT_TO_LIST (rat, i->flag)) - longjmp (i->env, 1); + rat->Point1.Y == (i->polygon->Clipped->contours->head.point[1]) && + rat->group1 == i->layer) || + (rat->Point2.X == (i->polygon->Clipped->contours->head.point[0]) && + rat->Point2.Y == (i->polygon->Clipped->contours->head.point[1]) && + rat->group2 == i->layer)) + if (ADD_RAT_TO_LIST (rat, i->flag)) + longjmp (i->env, 1); } return 0; } @@ -2257,7 +2297,8 @@ LOCtoPolyRat_callback (const BoxType * b, void *cl) * on the given layergroup. All found connections are added to the list */ static bool -LookupLOConnectionsToPolygon (PolygonType *Polygon, Cardinal LayerGroup, int flag, bool AndRats) +LookupLOConnectionsToPolygon (PolygonType * Polygon, Cardinal LayerGroup, + int flag, bool AndRats) { Cardinal entry; struct lo_info info; @@ -2268,7 +2309,7 @@ LookupLOConnectionsToPolygon (PolygonType *Polygon, Cardinal LayerGroup, int fla info.flag = flag; info.polygon = Polygon; - search_box = expand_bounds ((BoxType *)info.polygon); + search_box = expand_bounds ((BoxType *) info.polygon); info.layer = LayerGroup; @@ -2276,10 +2317,10 @@ LookupLOConnectionsToPolygon (PolygonType *Polygon, Cardinal LayerGroup, int fla if (AndRats) { if (setjmp (info.env) == 0) - r_search (PCB->Data->rat_tree, &search_box, NULL, - LOCtoPolyRat_callback, &info); + r_search (PCB->Data->rat_tree, &search_box, NULL, + LOCtoPolyRat_callback, &info); else - return true; + return true; } /* loop over all layers of the group */ @@ -2293,42 +2334,42 @@ LookupLOConnectionsToPolygon (PolygonType *Polygon, Cardinal LayerGroup, int fla /* handle normal layers */ if (layer_no < max_copper_layer) - { - GList *i; - - /* check all polygons */ - for (i = layer->Polygon; i != NULL; i = g_list_next (i)) - { - PolygonType *polygon = i->data; - if (!TEST_FLAG (flag, polygon) - && IsPolygonInPolygon (polygon, Polygon) - && ADD_POLYGON_TO_LIST (layer_no, polygon, flag)) - return true; - } - - info.layer = layer_no; - /* check all lines */ - if (setjmp (info.env) == 0) - r_search (layer->line_tree, &search_box, - NULL, LOCtoPolyLine_callback, &info); - else - return true; - /* check all arcs */ - if (setjmp (info.env) == 0) - r_search (layer->arc_tree, &search_box, - NULL, LOCtoPolyArc_callback, &info); - else - return true; - } + { + GList *i; + + /* check all polygons */ + for (i = layer->Polygon; i != NULL; i = g_list_next (i)) + { + PolygonType *polygon = i->data; + if (!TEST_FLAG (flag, polygon) + && IsPolygonInPolygon (polygon, Polygon) + && ADD_POLYGON_TO_LIST (layer_no, polygon, flag)) + return true; + } + + info.layer = layer_no; + /* check all lines */ + if (setjmp (info.env) == 0) + r_search (layer->line_tree, &search_box, + NULL, LOCtoPolyLine_callback, &info); + else + return true; + /* check all arcs */ + if (setjmp (info.env) == 0) + r_search (layer->arc_tree, &search_box, + NULL, LOCtoPolyArc_callback, &info); + else + return true; + } else - { - info.layer = layer_no - max_copper_layer; - if (setjmp (info.env) == 0) - r_search (PCB->Data->pad_tree, &search_box, - NULL, LOCtoPolyPad_callback, &info); - else - return true; - } + { + info.layer = layer_no - max_copper_layer; + if (setjmp (info.env) == 0) + r_search (PCB->Data->pad_tree, &search_box, + NULL, LOCtoPolyPad_callback, &info); + else + return true; + } } return (false); } @@ -2342,7 +2383,7 @@ LookupLOConnectionsToPolygon (PolygonType *Polygon, Cardinal LayerGroup, int fla * - check all segments of the polygon against the arc. */ static bool -IsArcInPolygon (ArcType *Arc, PolygonType *Polygon) +IsArcInPolygon (ArcType * Arc, PolygonType * Polygon) { BoxType *Box = (BoxType *) Arc; @@ -2359,7 +2400,7 @@ IsArcInPolygon (ArcType *Arc, PolygonType *Polygon) POLYAREA *ap; if (!(ap = ArcPoly (Arc, Arc->Thickness + Bloat))) - return false; /* error */ + return false; /* error */ return isects (ap, Polygon, true); } return false; @@ -2374,7 +2415,7 @@ IsArcInPolygon (ArcType *Arc, PolygonType *Polygon) * - check all segments of the polygon against the line. */ static bool -IsLineInPolygon (LineType *Line, PolygonType *Polygon) +IsLineInPolygon (LineType * Line, PolygonType * Polygon) { BoxType *Box = (BoxType *) Line; POLYAREA *lp; @@ -2384,24 +2425,26 @@ IsLineInPolygon (LineType *Line, PolygonType *Polygon) return false; if (!Polygon->Clipped) return false; - if (TEST_FLAG(SQUAREFLAG,Line)&&(Line->Point1.X==Line->Point2.X||Line->Point1.Y==Line->Point2.Y)) - { - Coord wid = (Line->Thickness + Bloat + 1) / 2; - Coord x1, x2, y1, y2; - - x1 = MIN (Line->Point1.X, Line->Point2.X) - wid; - y1 = MIN (Line->Point1.Y, Line->Point2.Y) - wid; - x2 = MAX (Line->Point1.X, Line->Point2.X) + wid; - y2 = MAX (Line->Point1.Y, Line->Point2.Y) + wid; - return IsRectangleInPolygon (x1, y1, x2, y2, Polygon); - } + if (TEST_FLAG (SQUAREFLAG, Line) + && (Line->Point1.X == Line->Point2.X + || Line->Point1.Y == Line->Point2.Y)) + { + Coord wid = (Line->Thickness + Bloat + 1) / 2; + Coord x1, x2, y1, y2; + + x1 = MIN (Line->Point1.X, Line->Point2.X) - wid; + y1 = MIN (Line->Point1.Y, Line->Point2.Y) - wid; + x2 = MAX (Line->Point1.X, Line->Point2.X) + wid; + y2 = MAX (Line->Point1.Y, Line->Point2.Y) + wid; + return IsRectangleInPolygon (x1, y1, x2, y2, Polygon); + } if (Box->X1 <= Polygon->Clipped->contours->xmax + Bloat && Box->X2 >= Polygon->Clipped->contours->xmin - Bloat && Box->Y1 <= Polygon->Clipped->contours->ymax + Bloat && Box->Y2 >= Polygon->Clipped->contours->ymin - Bloat) { if (!(lp = LinePoly (Line, Line->Thickness + Bloat))) - return FALSE; /* error */ + return FALSE; /* error */ return isects (lp, Polygon, true); } return false; @@ -2413,9 +2456,9 @@ IsLineInPolygon (LineType *Line, PolygonType *Polygon) * The polygon is assumed to already have been proven non-clearing */ static bool -IsPadInPolygon (PadType *pad, PolygonType *polygon) +IsPadInPolygon (PadType * pad, PolygonType * polygon) { - return IsLineInPolygon ((LineType *) pad, polygon); + return IsLineInPolygon ((LineType *) pad, polygon); } /* --------------------------------------------------------------------------- @@ -2425,7 +2468,7 @@ IsPadInPolygon (PadType *pad, PolygonType *polygon) * If both fail check all lines of P1 against the ones of P2 */ static bool -IsPolygonInPolygon (PolygonType *P1, PolygonType *P2) +IsPolygonInPolygon (PolygonType * P1, PolygonType * P2) { if (!P1->Clipped || !P2->Clipped) return false; @@ -2448,32 +2491,32 @@ IsPolygonInPolygon (PolygonType *P1, PolygonType *P2) { PLINE *c; for (c = P1->Clipped->contours; c; c = c->next) - { - LineType line; - VNODE *v = &c->head; - if (c->xmin - Bloat <= P2->Clipped->contours->xmax && - c->xmax + Bloat >= P2->Clipped->contours->xmin && - c->ymin - Bloat <= P2->Clipped->contours->ymax && - c->ymax + Bloat >= P2->Clipped->contours->ymin) - { - - line.Point1.X = v->point[0]; - line.Point1.Y = v->point[1]; - line.Thickness = 2 * Bloat; - line.Clearance = 0; - line.Flags = NoFlags (); - for (v = v->next; v != &c->head; v = v->next) - { - line.Point2.X = v->point[0]; - line.Point2.Y = v->point[1]; - SetLineBoundingBox (&line); - if (IsLineInPolygon (&line, P2)) - return (true); - line.Point1.X = line.Point2.X; - line.Point1.Y = line.Point2.Y; - } - } - } + { + LineType line; + VNODE *v = &c->head; + if (c->xmin - Bloat <= P2->Clipped->contours->xmax && + c->xmax + Bloat >= P2->Clipped->contours->xmin && + c->ymin - Bloat <= P2->Clipped->contours->ymax && + c->ymax + Bloat >= P2->Clipped->contours->ymin) + { + + line.Point1.X = v->point[0]; + line.Point1.Y = v->point[1]; + line.Thickness = 2 * Bloat; + line.Clearance = 0; + line.Flags = NoFlags (); + for (v = v->next; v != &c->head; v = v->next) + { + line.Point2.X = v->point[0]; + line.Point2.Y = v->point[1]; + SetLineBoundingBox (&line); + if (IsLineInPolygon (&line, P2)) + return (true); + line.Point1.X = line.Point2.X; + line.Point1.Y = line.Point2.Y; + } + } + } } return (false); @@ -2483,13 +2526,13 @@ IsPolygonInPolygon (PolygonType *P1, PolygonType *P2) * writes the several names of an element to a file */ static void -PrintElementNameList (ElementType *Element, FILE * FP) +PrintElementNameList (ElementType * Element, FILE * FP) { static DynamicStringType cname, pname, vname; - CreateQuotedString (&cname, (char *)EMPTY (DESCRIPTION_NAME (Element))); - CreateQuotedString (&pname, (char *)EMPTY (NAMEONPCB_NAME (Element))); - CreateQuotedString (&vname, (char *)EMPTY (VALUE_NAME (Element))); + CreateQuotedString (&cname, (char *) EMPTY (DESCRIPTION_NAME (Element))); + CreateQuotedString (&pname, (char *) EMPTY (NAMEONPCB_NAME (Element))); + CreateQuotedString (&vname, (char *) EMPTY (VALUE_NAME (Element))); fprintf (FP, "(%s %s %s)\n", cname.Data, pname.Data, vname.Data); } @@ -2497,7 +2540,7 @@ PrintElementNameList (ElementType *Element, FILE * FP) * writes the several names of an element to a file */ static void -PrintConnectionElementName (ElementType *Element, FILE * FP) +PrintConnectionElementName (ElementType * Element, FILE * FP) { fputs ("Element", FP); PrintElementNameList (Element, FP); @@ -2508,8 +2551,8 @@ PrintConnectionElementName (ElementType *Element, FILE * FP) * prints one {pin,pad,via}/element entry of connection lists */ static void -PrintConnectionListEntry (char *ObjName, ElementType *Element, - bool FirstOne, FILE * FP) +PrintConnectionListEntry (char *ObjName, ElementType * Element, + bool FirstOne, FILE * FP) { static DynamicStringType oname; @@ -2520,9 +2563,9 @@ PrintConnectionListEntry (char *ObjName, ElementType *Element, { fprintf (FP, "\t\t%s ", oname.Data); if (Element) - PrintElementNameList (Element, FP); + PrintElementNameList (Element, FP); else - fputs ("(__VIA__)\n", FP); + fputs ("(__VIA__)\n", FP); } } @@ -2544,9 +2587,10 @@ PrintPadConnections (Cardinal Layer, FILE * FP, bool IsFirst) { ptr = PADLIST_ENTRY (Layer, 0); if (ptr != NULL) - PrintConnectionListEntry ((char *)UNKNOWN (ptr->Name), NULL, true, FP); + PrintConnectionListEntry ((char *) UNKNOWN (ptr->Name), NULL, true, + FP); else - printf ("Skipping NULL ptr in 1st part of PrintPadConnections\n"); + printf ("Skipping NULL ptr in 1st part of PrintPadConnections\n"); } /* we maybe have to start with i=1 if we are handling the @@ -2556,9 +2600,10 @@ PrintPadConnections (Cardinal Layer, FILE * FP, bool IsFirst) { ptr = PADLIST_ENTRY (Layer, i); if (ptr != NULL) - PrintConnectionListEntry ((char *)EMPTY (ptr->Name), (ElementType *)ptr->Element, false, FP); + PrintConnectionListEntry ((char *) EMPTY (ptr->Name), + (ElementType *) ptr->Element, false, FP); else - printf ("Skipping NULL ptr in 2nd part of PrintPadConnections\n"); + printf ("Skipping NULL ptr in 2nd part of PrintPadConnections\n"); } } @@ -2579,7 +2624,7 @@ PrintPinConnections (FILE * FP, bool IsFirst) { /* the starting pin */ pv = PVLIST_ENTRY (0); - PrintConnectionListEntry ((char *)EMPTY (pv->Name), NULL, true, FP); + PrintConnectionListEntry ((char *) EMPTY (pv->Name), NULL, true, FP); } /* we maybe have to start with i=1 if we are handling the @@ -2589,7 +2634,8 @@ PrintPinConnections (FILE * FP, bool IsFirst) { /* get the elements name or assume that its a via */ pv = PVLIST_ENTRY (i); - PrintConnectionListEntry ((char *)EMPTY (pv->Name), (ElementType *)pv->Element, false, FP); + PrintConnectionListEntry ((char *) EMPTY (pv->Name), + (ElementType *) pv->Element, false, FP); } } @@ -2608,8 +2654,8 @@ ListsEmpty (bool AndRats) for (i = 0; i < max_copper_layer && empty; i++) if (!LAYER_PTR (i)->no_drc) empty = empty && LineList[i].Location >= LineList[i].Number - && ArcList[i].Location >= ArcList[i].Number - && PolygonList[i].Location >= PolygonList[i].Number; + && ArcList[i].Location >= ArcList[i].Number + && PolygonList[i].Location >= PolygonList[i].Number; return (empty); } @@ -2642,11 +2688,11 @@ DoIt (int flag, bool AndRats, bool AndDraw) * from the description */ newone = LookupPVConnectionsToPVList (flag) || - LookupLOConnectionsToPVList (flag, AndRats) || - LookupLOConnectionsToLOList (flag, AndRats) || - LookupPVConnectionsToLOList (flag, AndRats); + LookupLOConnectionsToPVList (flag, AndRats) || + LookupLOConnectionsToLOList (flag, AndRats) || + LookupPVConnectionsToLOList (flag, AndRats); if (AndDraw) - DrawNewConnections (); + DrawNewConnections (); } while (!newone && !ListsEmpty (AndRats)); if (AndDraw) @@ -2658,7 +2704,8 @@ DoIt (int flag, bool AndRats, bool AndDraw) * prints all unused pins of an element to file FP */ static bool -PrintAndSelectUnusedPinsAndPadsOfElement (ElementType *Element, FILE * FP, int flag) +PrintAndSelectUnusedPinsAndPadsOfElement (ElementType * Element, FILE * FP, + int flag) { bool first = true; Cardinal number; @@ -2670,41 +2717,41 @@ PrintAndSelectUnusedPinsAndPadsOfElement (ElementType *Element, FILE * FP, int f { if (!TEST_FLAG (HOLEFLAG, pin)) { - /* pin might have bee checked before, add to list if not */ - if (!TEST_FLAG (flag, pin) && FP) - { - int i; - if (ADD_PV_TO_LIST (pin, flag)) - return true; - DoIt (flag, true, true); - number = PadList[COMPONENT_LAYER].Number - + PadList[SOLDER_LAYER].Number + PVList.Number; - /* the pin has no connection if it's the only - * list entry; don't count vias - */ - for (i = 0; i < PVList.Number; i++) - if (!PVLIST_ENTRY (i)->Element) - number--; - if (number == 1) - { - /* output of element name if not already done */ - if (first) - { - PrintConnectionElementName (Element, FP); - first = false; - } - - /* write name to list and draw selected object */ - CreateQuotedString (&oname, (char *)EMPTY (pin->Name)); - fprintf (FP, "\t%s\n", oname.Data); - SET_FLAG (SELECTEDFLAG, pin); - DrawPin (pin); - } - - /* reset found objects for the next pin */ - if (PrepareNextLoop (FP)) - return (true); - } + /* pin might have bee checked before, add to list if not */ + if (!TEST_FLAG (flag, pin) && FP) + { + int i; + if (ADD_PV_TO_LIST (pin, flag)) + return true; + DoIt (flag, true, true); + number = PadList[COMPONENT_LAYER].Number + + PadList[SOLDER_LAYER].Number + PVList.Number; + /* the pin has no connection if it's the only + * list entry; don't count vias + */ + for (i = 0; i < PVList.Number; i++) + if (!PVLIST_ENTRY (i)->Element) + number--; + if (number == 1) + { + /* output of element name if not already done */ + if (first) + { + PrintConnectionElementName (Element, FP); + first = false; + } + + /* write name to list and draw selected object */ + CreateQuotedString (&oname, (char *) EMPTY (pin->Name)); + fprintf (FP, "\t%s\n", oname.Data); + SET_FLAG (SELECTEDFLAG, pin); + DrawPin (pin); + } + + /* reset found objects for the next pin */ + if (PrepareNextLoop (FP)) + return (true); + } } } END_LOOP; @@ -2716,38 +2763,38 @@ PrintAndSelectUnusedPinsAndPadsOfElement (ElementType *Element, FILE * FP, int f /* pad might has bee checked before, add to list if not */ if (!TEST_FLAG (flag, pad) && FP) { - int i; - if (ADD_PAD_TO_LIST (TEST_FLAG (ONSOLDERFLAG, pad) - ? SOLDER_LAYER : COMPONENT_LAYER, pad, flag)) - return true; - DoIt (flag, true, true); - number = PadList[COMPONENT_LAYER].Number - + PadList[SOLDER_LAYER].Number + PVList.Number; - /* the pin has no connection if it's the only - * list entry; don't count vias - */ - for (i = 0; i < PVList.Number; i++) - if (!PVLIST_ENTRY (i)->Element) - number--; - if (number == 1) - { - /* output of element name if not already done */ - if (first) - { - PrintConnectionElementName (Element, FP); - first = false; - } - - /* write name to list and draw selected object */ - CreateQuotedString (&oname, (char *)EMPTY (pad->Name)); - fprintf (FP, "\t%s\n", oname.Data); - SET_FLAG (SELECTEDFLAG, pad); - DrawPad (pad); - } - - /* reset found objects for the next pin */ - if (PrepareNextLoop (FP)) - return (true); + int i; + if (ADD_PAD_TO_LIST (TEST_FLAG (ONSOLDERFLAG, pad) + ? SOLDER_LAYER : COMPONENT_LAYER, pad, flag)) + return true; + DoIt (flag, true, true); + number = PadList[COMPONENT_LAYER].Number + + PadList[SOLDER_LAYER].Number + PVList.Number; + /* the pin has no connection if it's the only + * list entry; don't count vias + */ + for (i = 0; i < PVList.Number; i++) + if (!PVLIST_ENTRY (i)->Element) + number--; + if (number == 1) + { + /* output of element name if not already done */ + if (first) + { + PrintConnectionElementName (Element, FP); + first = false; + } + + /* write name to list and draw selected object */ + CreateQuotedString (&oname, (char *) EMPTY (pad->Name)); + fprintf (FP, "\t%s\n", oname.Data); + SET_FLAG (SELECTEDFLAG, pad); + DrawPad (pad); + } + + /* reset found objects for the next pin */ + if (PrepareNextLoop (FP)) + return (true); } } END_LOOP; @@ -2794,7 +2841,8 @@ PrepareNextLoop (FILE * FP) * Returns true if operation was aborted */ static bool -PrintElementConnections (ElementType *Element, FILE * FP, int flag, bool AndDraw) +PrintElementConnections (ElementType * Element, FILE * FP, int flag, + bool AndDraw) { PrintConnectionElementName (Element, FP); @@ -2804,9 +2852,9 @@ PrintElementConnections (ElementType *Element, FILE * FP, int flag, bool AndDraw /* pin might have been checked before, add to list if not */ if (TEST_FLAG (flag, pin)) { - PrintConnectionListEntry ((char *)EMPTY (pin->Name), NULL, true, FP); - fputs ("\t\t__CHECKED_BEFORE__\n\t}\n", FP); - continue; + PrintConnectionListEntry ((char *) EMPTY (pin->Name), NULL, true, FP); + fputs ("\t\t__CHECKED_BEFORE__\n\t}\n", FP); + continue; } if (ADD_PV_TO_LIST (pin, flag)) return true; @@ -2828,9 +2876,9 @@ PrintElementConnections (ElementType *Element, FILE * FP, int flag, bool AndDraw /* pad might have been checked before, add to list if not */ if (TEST_FLAG (flag, pad)) { - PrintConnectionListEntry ((char *)EMPTY (pad->Name), NULL, true, FP); - fputs ("\t\t__CHECKED_BEFORE__\n\t}\n", FP); - continue; + PrintConnectionListEntry ((char *) EMPTY (pad->Name), NULL, true, FP); + fputs ("\t\t__CHECKED_BEFORE__\n\t}\n", FP); + continue; } layer = TEST_FLAG (ONSOLDERFLAG, pad) ? SOLDER_LAYER : COMPONENT_LAYER; if (ADD_PAD_TO_LIST (layer, pad, flag)) @@ -2839,8 +2887,8 @@ PrintElementConnections (ElementType *Element, FILE * FP, int flag, bool AndDraw /* print all found connections */ PrintPadConnections (layer, FP, true); PrintPadConnections (layer == - (COMPONENT_LAYER ? SOLDER_LAYER : COMPONENT_LAYER), - FP, false); + (COMPONENT_LAYER ? SOLDER_LAYER : COMPONENT_LAYER), + FP, false); PrintPinConnections (FP, false); fputs ("\t}\n", FP); if (PrepareNextLoop (FP)) @@ -2867,36 +2915,37 @@ DrawNewConnections (void) Cardinal layer = LayerStack[i]; if (PCB->Data->Layer[layer].On) - { - /* draw all new lines */ - position = LineList[layer].DrawLocation; - for (; position < LineList[layer].Number; position++) - DrawLine (LAYER_PTR (layer), LINELIST_ENTRY (layer, position)); - LineList[layer].DrawLocation = LineList[layer].Number; - - /* draw all new arcs */ - position = ArcList[layer].DrawLocation; - for (; position < ArcList[layer].Number; position++) - DrawArc (LAYER_PTR (layer), ARCLIST_ENTRY (layer, position)); - ArcList[layer].DrawLocation = ArcList[layer].Number; - - /* draw all new polygons */ - position = PolygonList[layer].DrawLocation; - for (; position < PolygonList[layer].Number; position++) - DrawPolygon (LAYER_PTR (layer), POLYGONLIST_ENTRY (layer, position)); - PolygonList[layer].DrawLocation = PolygonList[layer].Number; - } + { + /* draw all new lines */ + position = LineList[layer].DrawLocation; + for (; position < LineList[layer].Number; position++) + DrawLine (LAYER_PTR (layer), LINELIST_ENTRY (layer, position)); + LineList[layer].DrawLocation = LineList[layer].Number; + + /* draw all new arcs */ + position = ArcList[layer].DrawLocation; + for (; position < ArcList[layer].Number; position++) + DrawArc (LAYER_PTR (layer), ARCLIST_ENTRY (layer, position)); + ArcList[layer].DrawLocation = ArcList[layer].Number; + + /* draw all new polygons */ + position = PolygonList[layer].DrawLocation; + for (; position < PolygonList[layer].Number; position++) + DrawPolygon (LAYER_PTR (layer), + POLYGONLIST_ENTRY (layer, position)); + PolygonList[layer].DrawLocation = PolygonList[layer].Number; + } } /* draw all new pads */ if (PCB->PinOn) for (i = 0; i < 2; i++) { - position = PadList[i].DrawLocation; + position = PadList[i].DrawLocation; - for (; position < PadList[i].Number; position++) - DrawPad (PADLIST_ENTRY (i, position)); - PadList[i].DrawLocation = PadList[i].Number; + for (; position < PadList[i].Number; position++) + DrawPad (PADLIST_ENTRY (i, position)); + PadList[i].DrawLocation = PadList[i].Number; } /* draw all new PVs; 'PVList' holds a list of pointers to the @@ -2907,12 +2956,12 @@ DrawNewConnections (void) PinType *pv = PVLIST_ENTRY (PVList.DrawLocation); if (TEST_FLAG (PINFLAG, pv)) - { - if (PCB->PinOn) - DrawPin (pv); - } + { + if (PCB->PinOn) + DrawPin (pv); + } else if (PCB->ViaOn) - DrawVia (pv); + DrawVia (pv); PVList.DrawLocation++; } /* draw the new rat-lines */ @@ -2920,7 +2969,7 @@ DrawNewConnections (void) { position = RatList.DrawLocation; for (; position < RatList.Number; position++) - DrawRat (RATLIST_ENTRY (position)); + DrawRat (RATLIST_ENTRY (position)); RatList.DrawLocation = RatList.Number; } } @@ -2929,7 +2978,7 @@ DrawNewConnections (void) * find all connections to pins within one element */ void -LookupElementConnections (ElementType *Element, FILE * FP) +LookupElementConnections (ElementType * Element, FILE * FP) { /* reset all currently marked connections */ User = true; @@ -2985,56 +3034,56 @@ ListStart (int type, void *ptr1, void *ptr2, void *ptr3, int flag) case PIN_TYPE: case VIA_TYPE: { - if (ADD_PV_TO_LIST ((PinType *) ptr2, flag)) - return true; - break; + if (ADD_PV_TO_LIST ((PinType *) ptr2, flag)) + return true; + break; } case RATLINE_TYPE: { - if (ADD_RAT_TO_LIST ((RatType *) ptr1, flag)) - return true; - break; + if (ADD_RAT_TO_LIST ((RatType *) ptr1, flag)) + return true; + break; } case LINE_TYPE: { - int layer = GetLayerNumber (PCB->Data, - (LayerType *) ptr1); + int layer = GetLayerNumber (PCB->Data, + (LayerType *) ptr1); - if (ADD_LINE_TO_LIST (layer, (LineType *) ptr2, flag)) - return true; - break; + if (ADD_LINE_TO_LIST (layer, (LineType *) ptr2, flag)) + return true; + break; } case ARC_TYPE: { - int layer = GetLayerNumber (PCB->Data, - (LayerType *) ptr1); + int layer = GetLayerNumber (PCB->Data, + (LayerType *) ptr1); - if (ADD_ARC_TO_LIST (layer, (ArcType *) ptr2, flag)) - return true; - break; + if (ADD_ARC_TO_LIST (layer, (ArcType *) ptr2, flag)) + return true; + break; } case POLYGON_TYPE: { - int layer = GetLayerNumber (PCB->Data, - (LayerType *) ptr1); + int layer = GetLayerNumber (PCB->Data, + (LayerType *) ptr1); - if (ADD_POLYGON_TO_LIST (layer, (PolygonType *) ptr2, flag)) - return true; - break; + if (ADD_POLYGON_TO_LIST (layer, (PolygonType *) ptr2, flag)) + return true; + break; } case PAD_TYPE: { - PadType *pad = (PadType *) ptr2; - if (ADD_PAD_TO_LIST - (TEST_FLAG - (ONSOLDERFLAG, pad) ? SOLDER_LAYER : COMPONENT_LAYER, pad, flag)) - return true; - break; + PadType *pad = (PadType *) ptr2; + if (ADD_PAD_TO_LIST + (TEST_FLAG + (ONSOLDERFLAG, pad) ? SOLDER_LAYER : COMPONENT_LAYER, pad, flag)) + return true; + break; } } return (false); @@ -3049,7 +3098,7 @@ ListStart (int type, void *ptr1, void *ptr2, void *ptr3, int flag) */ void LookupConnection (Coord X, Coord Y, bool AndDraw, Coord Range, int flag, - bool AndRats) + bool AndRats) { void *ptr1, *ptr2, *ptr3; char *name; @@ -3057,26 +3106,26 @@ LookupConnection (Coord X, Coord Y, bool AndDraw, Coord Range, int flag, /* check if there are any pins or pads at that position */ - reassign_no_drc_flags (); + reassign_no_drc_flags (); type = SearchObjectByLocation (LOOKUP_FIRST, &ptr1, &ptr2, &ptr3, X, Y, Range); if (type == NO_TYPE) { - type = SearchObjectByLocation ( - LOOKUP_MORE & ~(AndRats ? 0 : RATLINE_TYPE), - &ptr1, &ptr2, &ptr3, X, Y, Range); + type = + SearchObjectByLocation (LOOKUP_MORE & ~(AndRats ? 0 : RATLINE_TYPE), + &ptr1, &ptr2, &ptr3, X, Y, Range); if (type == NO_TYPE) - return; + return; if (type & SILK_TYPE) - { - int laynum = GetLayerNumber (PCB->Data, - (LayerType *) ptr1); - - /* don't mess with non-conducting objects! */ - if (laynum >= max_copper_layer || ((LayerType *)ptr1)->no_drc) - return; - } + { + int laynum = GetLayerNumber (PCB->Data, + (LayerType *) ptr1); + + /* don't mess with non-conducting objects! */ + if (laynum >= max_copper_layer || ((LayerType *) ptr1)->no_drc) + return; + } } name = ConnectionName (type, ptr1, ptr2); @@ -3102,13 +3151,26 @@ LookupConnection (Coord X, Coord Y, bool AndDraw, Coord Range, int flag, FreeConnectionLookupMemory (); } +void +LookupConnectionByPin (int type, void *ptr1) +{ + User = 0; +// TheFlag = FOUNDFLAG; + InitConnectionLookup (); + ListStart (type, NULL, ptr1, NULL, FOUNDFLAG); + + DoIt (FOUNDFLAG, true, false); + + FreeConnectionLookupMemory (); +} + /* --------------------------------------------------------------------------- * find connections for rats nesting * assumes InitConnectionLookup() has already been done */ void RatFindHook (int type, void *ptr1, void *ptr2, void *ptr3, - bool undo, int flag, bool AndRats) + bool undo, int flag, bool AndRats) { User = undo; DumpList (); @@ -3158,12 +3220,12 @@ ClearFlagOnPinsViasAndPads (bool AndDraw, int flag) { if (TEST_FLAG (flag, via)) { - if (AndDraw) - AddObjectToFlagUndoList (VIA_TYPE, via, via, via); - CLEAR_FLAG (flag, via); - if (AndDraw) - DrawVia (via); - change = true; + if (AndDraw) + AddObjectToFlagUndoList (VIA_TYPE, via, via, via); + CLEAR_FLAG (flag, via); + if (AndDraw) + DrawVia (via); + change = true; } } END_LOOP; @@ -3172,27 +3234,27 @@ ClearFlagOnPinsViasAndPads (bool AndDraw, int flag) PIN_LOOP (element); { if (TEST_FLAG (flag, pin)) - { - if (AndDraw) - AddObjectToFlagUndoList (PIN_TYPE, element, pin, pin); - CLEAR_FLAG (flag, pin); - if (AndDraw) - DrawPin (pin); - change = true; - } + { + if (AndDraw) + AddObjectToFlagUndoList (PIN_TYPE, element, pin, pin); + CLEAR_FLAG (flag, pin); + if (AndDraw) + DrawPin (pin); + change = true; + } } END_LOOP; PAD_LOOP (element); { if (TEST_FLAG (flag, pad)) - { - if (AndDraw) - AddObjectToFlagUndoList (PAD_TYPE, element, pad, pad); - CLEAR_FLAG (flag, pad); - if (AndDraw) - DrawPad (pad); - change = true; - } + { + if (AndDraw) + AddObjectToFlagUndoList (PAD_TYPE, element, pad, pad); + CLEAR_FLAG (flag, pad); + if (AndDraw) + DrawPad (pad); + change = true; + } } END_LOOP; } @@ -3214,12 +3276,12 @@ ClearFlagOnLinesAndPolygons (bool AndDraw, int flag) { if (TEST_FLAG (flag, line)) { - if (AndDraw) - AddObjectToFlagUndoList (RATLINE_TYPE, line, line, line); - CLEAR_FLAG (flag, line); - if (AndDraw) - DrawRat (line); - change = true; + if (AndDraw) + AddObjectToFlagUndoList (RATLINE_TYPE, line, line, line); + CLEAR_FLAG (flag, line); + if (AndDraw) + DrawRat (line); + change = true; } } END_LOOP; @@ -3227,12 +3289,12 @@ ClearFlagOnLinesAndPolygons (bool AndDraw, int flag) { if (TEST_FLAG (flag, line)) { - if (AndDraw) - AddObjectToFlagUndoList (LINE_TYPE, layer, line, line); - CLEAR_FLAG (flag, line); - if (AndDraw) - DrawLine (layer, line); - change = true; + if (AndDraw) + AddObjectToFlagUndoList (LINE_TYPE, layer, line, line); + CLEAR_FLAG (flag, line); + if (AndDraw) + DrawLine (layer, line); + change = true; } } ENDALL_LOOP; @@ -3240,12 +3302,12 @@ ClearFlagOnLinesAndPolygons (bool AndDraw, int flag) { if (TEST_FLAG (flag, arc)) { - if (AndDraw) - AddObjectToFlagUndoList (ARC_TYPE, layer, arc, arc); - CLEAR_FLAG (flag, arc); - if (AndDraw) - DrawArc (layer, arc); - change = true; + if (AndDraw) + AddObjectToFlagUndoList (ARC_TYPE, layer, arc, arc); + CLEAR_FLAG (flag, arc); + if (AndDraw) + DrawArc (layer, arc); + change = true; } } ENDALL_LOOP; @@ -3253,12 +3315,12 @@ ClearFlagOnLinesAndPolygons (bool AndDraw, int flag) { if (TEST_FLAG (flag, polygon)) { - if (AndDraw) - AddObjectToFlagUndoList (POLYGON_TYPE, layer, polygon, polygon); - CLEAR_FLAG (flag, polygon); - if (AndDraw) - DrawPolygon (layer, polygon); - change = true; + if (AndDraw) + AddObjectToFlagUndoList (POLYGON_TYPE, layer, polygon, polygon); + CLEAR_FLAG (flag, polygon); + if (AndDraw) + DrawPolygon (layer, polygon); + change = true; } } ENDALL_LOOP; @@ -3275,7 +3337,7 @@ ClearFlagOnAllObjects (bool AndDraw, int flag) { bool change = false; - change = ClearFlagOnPinsViasAndPads (AndDraw, flag) || change; + change = ClearFlagOnPinsViasAndPads (AndDraw, flag) || change; change = ClearFlagOnLinesAndPolygons (AndDraw, flag) || change; return change; @@ -3344,49 +3406,45 @@ DRCFind (int What, void *ptr1, void *ptr2, void *ptr3) DumpList (); ListStart (What, ptr1, ptr2, ptr3, FOUNDFLAG); Bloat = 0; - drc = true; /* abort the search if we find anything not already found */ + drc = true; /* abort the search if we find anything not already found */ if (DoIt (FOUNDFLAG, true, false)) - { - DumpList (); - /* make the flag changes undoable */ - ClearFlagOnAllObjects (false, FOUNDFLAG | SELECTEDFLAG); - User = true; - drc = false; - Bloat = -PCB->Shrink; - ListStart (What, ptr1, ptr2, ptr3, SELECTEDFLAG); - DoIt (SELECTEDFLAG, true, true); - DumpList (); - ListStart (What, ptr1, ptr2, ptr3, FOUNDFLAG); - Bloat = 0; - drc = true; - DoIt (FOUNDFLAG, true, true); - DumpList (); - User = false; - drc = false; - drcerr_count++; - LocateError (&x, &y); - BuildObjectList (&object_count, &object_id_list, &object_type_list); - violation = pcb_drc_violation_new (_("Potential for broken trace"), - _("Insufficient overlap between objects can lead to broken tracks\n" - "due to registration errors with old wheel style photo-plotters."), - x, y, - 0, /* ANGLE OF ERROR UNKNOWN */ - FALSE, /* MEASUREMENT OF ERROR UNKNOWN */ - 0, /* MAGNITUDE OF ERROR UNKNOWN */ - PCB->Shrink, - object_count, - object_id_list, - object_type_list); - append_drc_violation (violation); - pcb_drc_violation_free (violation); - free (object_id_list); - free (object_type_list); - - if (!throw_drc_dialog()) - return (true); - IncrementUndoSerialNumber (); - Undo (true); - } + { + DumpList (); + /* make the flag changes undoable */ + ClearFlagOnAllObjects (false, FOUNDFLAG | SELECTEDFLAG); + User = true; + drc = false; + Bloat = -PCB->Shrink; + ListStart (What, ptr1, ptr2, ptr3, SELECTEDFLAG); + DoIt (SELECTEDFLAG, true, true); + DumpList (); + ListStart (What, ptr1, ptr2, ptr3, FOUNDFLAG); + Bloat = 0; + drc = true; + DoIt (FOUNDFLAG, true, true); + DumpList (); + User = false; + drc = false; + drcerr_count++; + LocateError (&x, &y); + BuildObjectList (&object_count, &object_id_list, &object_type_list); + violation = pcb_drc_violation_new (_("Potential for broken trace"), _("Insufficient overlap between objects can lead to broken tracks\n" "due to registration errors with old wheel style photo-plotters."), x, y, 0, /* ANGLE OF ERROR UNKNOWN */ + FALSE, /* MEASUREMENT OF ERROR UNKNOWN */ + 0, /* MAGNITUDE OF ERROR UNKNOWN */ + PCB->Shrink, + object_count, + object_id_list, + object_type_list); + append_drc_violation (violation); + pcb_drc_violation_free (violation); + free (object_id_list); + free (object_type_list); + + if (!throw_drc_dialog ()) + return (true); + IncrementUndoSerialNumber (); + Undo (true); + } DumpList (); } /* now check the bloated condition */ @@ -3419,25 +3477,20 @@ DRCFind (int What, void *ptr1, void *ptr2, void *ptr3) drcerr_count++; LocateError (&x, &y); BuildObjectList (&object_count, &object_id_list, &object_type_list); - violation = pcb_drc_violation_new (_("Copper areas too close"), - _("Circuits that are too close may bridge during imaging, etching,\n" - "plating, or soldering processes resulting in a direct short."), - x, y, - 0, /* ANGLE OF ERROR UNKNOWN */ - FALSE, /* MEASUREMENT OF ERROR UNKNOWN */ - 0, /* MAGNITUDE OF ERROR UNKNOWN */ - PCB->Bloat, - object_count, - object_id_list, - object_type_list); + violation = pcb_drc_violation_new (_("Copper areas too close"), _("Circuits that are too close may bridge during imaging, etching,\n" "plating, or soldering processes resulting in a direct short."), x, y, 0, /* ANGLE OF ERROR UNKNOWN */ + FALSE, /* MEASUREMENT OF ERROR UNKNOWN */ + 0, /* MAGNITUDE OF ERROR UNKNOWN */ + PCB->Bloat, + object_count, + object_id_list, object_type_list); append_drc_violation (violation); pcb_drc_violation_free (violation); free (object_id_list); free (object_type_list); User = false; drc = false; - if (!throw_drc_dialog()) - return (true); + if (!throw_drc_dialog ()) + return (true); IncrementUndoSerialNumber (); Undo (true); /* highlight the rest of the encroaching net so it's not reported again */ @@ -3459,8 +3512,8 @@ DRCFind (int What, void *ptr1, void *ptr2, void *ptr3) /* DRC clearance callback */ static int -drc_callback (DataType *data, LayerType *layer, PolygonType *polygon, - int type, void *ptr1, void *ptr2, void *userdata) +drc_callback (DataType * data, LayerType * layer, PolygonType * polygon, + int type, void *ptr1, void *ptr2, void *userdata) { struct drc_info *i = (struct drc_info *) userdata; char *message; @@ -3481,25 +3534,25 @@ drc_callback (DataType *data, LayerType *layer, PolygonType *polygon, { case LINE_TYPE: if (line->Clearance < 2 * PCB->Bloat) - { - AddObjectToFlagUndoList (type, ptr1, ptr2, ptr2); - SET_FLAG (i->flag, line); - message = _("Line with insufficient clearance inside polygon\n"); - goto doIsBad; - } + { + AddObjectToFlagUndoList (type, ptr1, ptr2, ptr2); + SET_FLAG (i->flag, line); + message = _("Line with insufficient clearance inside polygon\n"); + goto doIsBad; + } break; case ARC_TYPE: if (arc->Clearance < 2 * PCB->Bloat) - { - AddObjectToFlagUndoList (type, ptr1, ptr2, ptr2); - SET_FLAG (i->flag, arc); - message = _("Arc with insufficient clearance inside polygon\n"); - goto doIsBad; - } + { + AddObjectToFlagUndoList (type, ptr1, ptr2, ptr2); + SET_FLAG (i->flag, arc); + message = _("Arc with insufficient clearance inside polygon\n"); + goto doIsBad; + } break; case PAD_TYPE: if (pad->Clearance && pad->Clearance < 2 * PCB->Bloat) - if (IsPadInPolygon(pad,polygon)) + if (IsPadInPolygon (pad, polygon)) { AddObjectToFlagUndoList (type, ptr1, ptr2, ptr2); SET_FLAG (i->flag, pad); @@ -3509,21 +3562,21 @@ drc_callback (DataType *data, LayerType *layer, PolygonType *polygon, break; case PIN_TYPE: if (pin->Clearance && pin->Clearance < 2 * PCB->Bloat) - { - AddObjectToFlagUndoList (type, ptr1, ptr2, ptr2); - SET_FLAG (i->flag, pin); - message = _("Pin with insufficient clearance inside polygon\n"); - goto doIsBad; - } + { + AddObjectToFlagUndoList (type, ptr1, ptr2, ptr2); + SET_FLAG (i->flag, pin); + message = _("Pin with insufficient clearance inside polygon\n"); + goto doIsBad; + } break; case VIA_TYPE: if (pin->Clearance && pin->Clearance < 2 * PCB->Bloat) - { - AddObjectToFlagUndoList (type, ptr1, ptr2, ptr2); - SET_FLAG (i->flag, pin); - message = _("Via with insufficient clearance inside polygon\n"); - goto doIsBad; - } + { + AddObjectToFlagUndoList (type, ptr1, ptr2, ptr2); + SET_FLAG (i->flag, pin); + message = _("Via with insufficient clearance inside polygon\n"); + goto doIsBad; + } break; default: Message ("hace: Bad Plow object in callback\n"); @@ -3538,23 +3591,18 @@ doIsBad: drcerr_count++; LocateError (&x, &y); BuildObjectList (&object_count, &object_id_list, &object_type_list); - violation = pcb_drc_violation_new (message, - _("Circuits that are too close may bridge during imaging, etching,\n" - "plating, or soldering processes resulting in a direct short."), - x, y, - 0, /* ANGLE OF ERROR UNKNOWN */ - FALSE, /* MEASUREMENT OF ERROR UNKNOWN */ - 0, /* MAGNITUDE OF ERROR UNKNOWN */ - PCB->Bloat, - object_count, - object_id_list, - object_type_list); + violation = pcb_drc_violation_new (message, _("Circuits that are too close may bridge during imaging, etching,\n" "plating, or soldering processes resulting in a direct short."), x, y, 0, /* ANGLE OF ERROR UNKNOWN */ + FALSE, /* MEASUREMENT OF ERROR UNKNOWN */ + 0, /* MAGNITUDE OF ERROR UNKNOWN */ + PCB->Bloat, + object_count, + object_id_list, object_type_list); append_drc_violation (violation); pcb_drc_violation_free (violation); free (object_id_list); free (object_type_list); - if (!throw_drc_dialog()) + if (!throw_drc_dialog ()) return 1; IncrementUndoSerialNumber (); @@ -3579,7 +3627,7 @@ DRCAll (void) bool IsBad; struct drc_info info; - reset_drc_dialog_message(); + reset_drc_dialog_message (); IsBad = false; drcerr_count = 0; @@ -3601,11 +3649,11 @@ DRCAll (void) PIN_LOOP (element); { if (!TEST_FLAG (DRCFLAG, pin) - && DRCFind (PIN_TYPE, (void *) element, (void *) pin, (void *) pin)) - { - IsBad = true; - break; - } + && DRCFind (PIN_TYPE, (void *) element, (void *) pin, (void *) pin)) + { + IsBad = true; + break; + } } END_LOOP; if (IsBad) @@ -3618,11 +3666,11 @@ DRCAll (void) nopastecnt++; if (!TEST_FLAG (DRCFLAG, pad) - && DRCFind (PAD_TYPE, (void *) element, (void *) pad, (void *) pad)) - { - IsBad = true; - break; - } + && DRCFind (PAD_TYPE, (void *) element, (void *) pad, (void *) pad)) + { + IsBad = true; + break; + } } END_LOOP; if (IsBad) @@ -3633,59 +3681,59 @@ DRCAll (void) VIA_LOOP (PCB->Data); { if (!TEST_FLAG (DRCFLAG, via) - && DRCFind (VIA_TYPE, (void *) via, (void *) via, (void *) via)) + && DRCFind (VIA_TYPE, (void *) via, (void *) via, (void *) via)) { - IsBad = true; - break; + IsBad = true; + break; } } END_LOOP; - ClearFlagOnAllObjects (false, IsBad ? DRCFLAG : (FOUNDFLAG | DRCFLAG | SELECTEDFLAG)); + ClearFlagOnAllObjects (false, + IsBad ? DRCFLAG : (FOUNDFLAG | DRCFLAG | + SELECTEDFLAG)); info.flag = SELECTEDFLAG; /* check minimum widths and polygon clearances */ if (!IsBad) { COPPERLINE_LOOP (PCB->Data); { - /* check line clearances in polygons */ - if (PlowsPolygon (PCB->Data, LINE_TYPE, layer, line, drc_callback, &info)) - { - IsBad = true; - break; - } - if (line->Thickness < PCB->minWid) - { - AddObjectToFlagUndoList (LINE_TYPE, layer, line, line); - SET_FLAG (SELECTEDFLAG, line); - DrawLine (layer, line); - drcerr_count++; - SetThing (LINE_TYPE, layer, line, line); - LocateError (&x, &y); - BuildObjectList (&object_count, &object_id_list, &object_type_list); - violation = pcb_drc_violation_new (_("Line width is too thin"), - _("Process specifications dictate a minimum feature-width\n" - "that can reliably be reproduced"), - x, y, - 0, /* ANGLE OF ERROR UNKNOWN */ - TRUE, /* MEASUREMENT OF ERROR KNOWN */ - line->Thickness, - PCB->minWid, - object_count, - object_id_list, - object_type_list); - append_drc_violation (violation); - pcb_drc_violation_free (violation); - free (object_id_list); - free (object_type_list); - if (!throw_drc_dialog()) - { - IsBad = true; - break; - } - IncrementUndoSerialNumber (); - Undo (false); - } + /* check line clearances in polygons */ + if (PlowsPolygon + (PCB->Data, LINE_TYPE, layer, line, drc_callback, &info)) + { + IsBad = true; + break; + } + if (line->Thickness < PCB->minWid) + { + AddObjectToFlagUndoList (LINE_TYPE, layer, line, line); + SET_FLAG (SELECTEDFLAG, line); + DrawLine (layer, line); + drcerr_count++; + SetThing (LINE_TYPE, layer, line, line); + LocateError (&x, &y); + BuildObjectList (&object_count, &object_id_list, + &object_type_list); + violation = pcb_drc_violation_new (_("Line width is too thin"), _("Process specifications dictate a minimum feature-width\n" "that can reliably be reproduced"), x, y, 0, /* ANGLE OF ERROR UNKNOWN */ + TRUE, /* MEASUREMENT OF ERROR KNOWN */ + line->Thickness, + PCB->minWid, + object_count, + object_id_list, + object_type_list); + append_drc_violation (violation); + pcb_drc_violation_free (violation); + free (object_id_list); + free (object_type_list); + if (!throw_drc_dialog ()) + { + IsBad = true; + break; + } + IncrementUndoSerialNumber (); + Undo (false); + } } ENDALL_LOOP; } @@ -3693,43 +3741,41 @@ DRCAll (void) { COPPERARC_LOOP (PCB->Data); { - if (PlowsPolygon (PCB->Data, ARC_TYPE, layer, arc, drc_callback, &info)) - { - IsBad = true; - break; - } - if (arc->Thickness < PCB->minWid) - { - AddObjectToFlagUndoList (ARC_TYPE, layer, arc, arc); - SET_FLAG (SELECTEDFLAG, arc); - DrawArc (layer, arc); - drcerr_count++; - SetThing (ARC_TYPE, layer, arc, arc); - LocateError (&x, &y); - BuildObjectList (&object_count, &object_id_list, &object_type_list); - violation = pcb_drc_violation_new (_("Arc width is too thin"), - _("Process specifications dictate a minimum feature-width\n" - "that can reliably be reproduced"), - x, y, - 0, /* ANGLE OF ERROR UNKNOWN */ - TRUE, /* MEASUREMENT OF ERROR KNOWN */ - arc->Thickness, - PCB->minWid, - object_count, - object_id_list, - object_type_list); - append_drc_violation (violation); - pcb_drc_violation_free (violation); - free (object_id_list); - free (object_type_list); - if (!throw_drc_dialog()) - { - IsBad = true; - break; - } - IncrementUndoSerialNumber (); - Undo (false); - } + if (PlowsPolygon + (PCB->Data, ARC_TYPE, layer, arc, drc_callback, &info)) + { + IsBad = true; + break; + } + if (arc->Thickness < PCB->minWid) + { + AddObjectToFlagUndoList (ARC_TYPE, layer, arc, arc); + SET_FLAG (SELECTEDFLAG, arc); + DrawArc (layer, arc); + drcerr_count++; + SetThing (ARC_TYPE, layer, arc, arc); + LocateError (&x, &y); + BuildObjectList (&object_count, &object_id_list, + &object_type_list); + violation = pcb_drc_violation_new (_("Arc width is too thin"), _("Process specifications dictate a minimum feature-width\n" "that can reliably be reproduced"), x, y, 0, /* ANGLE OF ERROR UNKNOWN */ + TRUE, /* MEASUREMENT OF ERROR KNOWN */ + arc->Thickness, + PCB->minWid, + object_count, + object_id_list, + object_type_list); + append_drc_violation (violation); + pcb_drc_violation_free (violation); + free (object_id_list); + free (object_type_list); + if (!throw_drc_dialog ()) + { + IsBad = true; + break; + } + IncrementUndoSerialNumber (); + Undo (false); + } } ENDALL_LOOP; } @@ -3737,75 +3783,71 @@ DRCAll (void) { ALLPIN_LOOP (PCB->Data); { - if (PlowsPolygon (PCB->Data, PIN_TYPE, element, pin, drc_callback, &info)) - { - IsBad = true; - break; - } - if (!TEST_FLAG (HOLEFLAG, pin) && - pin->Thickness - pin->DrillingHole < 2 * PCB->minRing) - { - AddObjectToFlagUndoList (PIN_TYPE, element, pin, pin); - SET_FLAG (SELECTEDFLAG, pin); - DrawPin (pin); - drcerr_count++; - SetThing (PIN_TYPE, element, pin, pin); - LocateError (&x, &y); - BuildObjectList (&object_count, &object_id_list, &object_type_list); - violation = pcb_drc_violation_new (_("Pin annular ring too small"), - _("Annular rings that are too small may erode during etching,\n" - "resulting in a broken connection"), - x, y, - 0, /* ANGLE OF ERROR UNKNOWN */ - TRUE, /* MEASUREMENT OF ERROR KNOWN */ - (pin->Thickness - pin->DrillingHole) / 2, - PCB->minRing, - object_count, - object_id_list, - object_type_list); - append_drc_violation (violation); - pcb_drc_violation_free (violation); - free (object_id_list); - free (object_type_list); - if (!throw_drc_dialog()) - { - IsBad = true; - break; - } - IncrementUndoSerialNumber (); - Undo (false); - } - if (pin->DrillingHole < PCB->minDrill) - { - AddObjectToFlagUndoList (PIN_TYPE, element, pin, pin); - SET_FLAG (SELECTEDFLAG, pin); - DrawPin (pin); - drcerr_count++; - SetThing (PIN_TYPE, element, pin, pin); - LocateError (&x, &y); - BuildObjectList (&object_count, &object_id_list, &object_type_list); - violation = pcb_drc_violation_new (_("Pin drill size is too small"), - _("Process rules dictate the minimum drill size which can be used"), - x, y, - 0, /* ANGLE OF ERROR UNKNOWN */ - TRUE, /* MEASUREMENT OF ERROR KNOWN */ - pin->DrillingHole, - PCB->minDrill, - object_count, - object_id_list, - object_type_list); - append_drc_violation (violation); - pcb_drc_violation_free (violation); - free (object_id_list); - free (object_type_list); - if (!throw_drc_dialog()) - { - IsBad = true; - break; - } - IncrementUndoSerialNumber (); - Undo (false); - } + if (PlowsPolygon + (PCB->Data, PIN_TYPE, element, pin, drc_callback, &info)) + { + IsBad = true; + break; + } + if (!TEST_FLAG (HOLEFLAG, pin) && + pin->Thickness - pin->DrillingHole < 2 * PCB->minRing) + { + AddObjectToFlagUndoList (PIN_TYPE, element, pin, pin); + SET_FLAG (SELECTEDFLAG, pin); + DrawPin (pin); + drcerr_count++; + SetThing (PIN_TYPE, element, pin, pin); + LocateError (&x, &y); + BuildObjectList (&object_count, &object_id_list, + &object_type_list); + violation = pcb_drc_violation_new (_("Pin annular ring too small"), _("Annular rings that are too small may erode during etching,\n" "resulting in a broken connection"), x, y, 0, /* ANGLE OF ERROR UNKNOWN */ + TRUE, /* MEASUREMENT OF ERROR KNOWN */ + (pin->Thickness - + pin->DrillingHole) / 2, + PCB->minRing, object_count, + object_id_list, + object_type_list); + append_drc_violation (violation); + pcb_drc_violation_free (violation); + free (object_id_list); + free (object_type_list); + if (!throw_drc_dialog ()) + { + IsBad = true; + break; + } + IncrementUndoSerialNumber (); + Undo (false); + } + if (pin->DrillingHole < PCB->minDrill) + { + AddObjectToFlagUndoList (PIN_TYPE, element, pin, pin); + SET_FLAG (SELECTEDFLAG, pin); + DrawPin (pin); + drcerr_count++; + SetThing (PIN_TYPE, element, pin, pin); + LocateError (&x, &y); + BuildObjectList (&object_count, &object_id_list, + &object_type_list); + violation = pcb_drc_violation_new (_("Pin drill size is too small"), _("Process rules dictate the minimum drill size which can be used"), x, y, 0, /* ANGLE OF ERROR UNKNOWN */ + TRUE, /* MEASUREMENT OF ERROR KNOWN */ + pin->DrillingHole, + PCB->minDrill, + object_count, + object_id_list, + object_type_list); + append_drc_violation (violation); + pcb_drc_violation_free (violation); + free (object_id_list); + free (object_type_list); + if (!throw_drc_dialog ()) + { + IsBad = true; + break; + } + IncrementUndoSerialNumber (); + Undo (false); + } } ENDALL_LOOP; } @@ -3813,43 +3855,41 @@ DRCAll (void) { ALLPAD_LOOP (PCB->Data); { - if (PlowsPolygon (PCB->Data, PAD_TYPE, element, pad, drc_callback, &info)) - { - IsBad = true; - break; - } - if (pad->Thickness < PCB->minWid) - { - AddObjectToFlagUndoList (PAD_TYPE, element, pad, pad); - SET_FLAG (SELECTEDFLAG, pad); - DrawPad (pad); - drcerr_count++; - SetThing (PAD_TYPE, element, pad, pad); - LocateError (&x, &y); - BuildObjectList (&object_count, &object_id_list, &object_type_list); - violation = pcb_drc_violation_new (_("Pad is too thin"), - _("Pads which are too thin may erode during etching,\n" - "resulting in a broken or unreliable connection"), - x, y, - 0, /* ANGLE OF ERROR UNKNOWN */ - TRUE, /* MEASUREMENT OF ERROR KNOWN */ - pad->Thickness, - PCB->minWid, - object_count, - object_id_list, - object_type_list); - append_drc_violation (violation); - pcb_drc_violation_free (violation); - free (object_id_list); - free (object_type_list); - if (!throw_drc_dialog()) - { - IsBad = true; - break; - } - IncrementUndoSerialNumber (); - Undo (false); - } + if (PlowsPolygon + (PCB->Data, PAD_TYPE, element, pad, drc_callback, &info)) + { + IsBad = true; + break; + } + if (pad->Thickness < PCB->minWid) + { + AddObjectToFlagUndoList (PAD_TYPE, element, pad, pad); + SET_FLAG (SELECTEDFLAG, pad); + DrawPad (pad); + drcerr_count++; + SetThing (PAD_TYPE, element, pad, pad); + LocateError (&x, &y); + BuildObjectList (&object_count, &object_id_list, + &object_type_list); + violation = pcb_drc_violation_new (_("Pad is too thin"), _("Pads which are too thin may erode during etching,\n" "resulting in a broken or unreliable connection"), x, y, 0, /* ANGLE OF ERROR UNKNOWN */ + TRUE, /* MEASUREMENT OF ERROR KNOWN */ + pad->Thickness, + PCB->minWid, + object_count, + object_id_list, + object_type_list); + append_drc_violation (violation); + pcb_drc_violation_free (violation); + free (object_id_list); + free (object_type_list); + if (!throw_drc_dialog ()) + { + IsBad = true; + break; + } + IncrementUndoSerialNumber (); + Undo (false); + } } ENDALL_LOOP; } @@ -3857,75 +3897,70 @@ DRCAll (void) { VIA_LOOP (PCB->Data); { - if (PlowsPolygon (PCB->Data, VIA_TYPE, via, via, drc_callback, &info)) - { - IsBad = true; - break; - } - if (!TEST_FLAG (HOLEFLAG, via) && - via->Thickness - via->DrillingHole < 2 * PCB->minRing) - { - AddObjectToFlagUndoList (VIA_TYPE, via, via, via); - SET_FLAG (SELECTEDFLAG, via); - DrawVia (via); - drcerr_count++; - SetThing (VIA_TYPE, via, via, via); - LocateError (&x, &y); - BuildObjectList (&object_count, &object_id_list, &object_type_list); - violation = pcb_drc_violation_new (_("Via annular ring too small"), - _("Annular rings that are too small may erode during etching,\n" - "resulting in a broken connection"), - x, y, - 0, /* ANGLE OF ERROR UNKNOWN */ - TRUE, /* MEASUREMENT OF ERROR KNOWN */ - (via->Thickness - via->DrillingHole) / 2, - PCB->minRing, - object_count, - object_id_list, - object_type_list); - append_drc_violation (violation); - pcb_drc_violation_free (violation); - free (object_id_list); - free (object_type_list); - if (!throw_drc_dialog()) - { - IsBad = true; - break; - } - IncrementUndoSerialNumber (); - Undo (false); - } - if (via->DrillingHole < PCB->minDrill) - { - AddObjectToFlagUndoList (VIA_TYPE, via, via, via); - SET_FLAG (SELECTEDFLAG, via); - DrawVia (via); - drcerr_count++; - SetThing (VIA_TYPE, via, via, via); - LocateError (&x, &y); - BuildObjectList (&object_count, &object_id_list, &object_type_list); - violation = pcb_drc_violation_new (_("Via drill size is too small"), - _("Process rules dictate the minimum drill size which can be used"), - x, y, - 0, /* ANGLE OF ERROR UNKNOWN */ - TRUE, /* MEASUREMENT OF ERROR KNOWN */ - via->DrillingHole, - PCB->minDrill, - object_count, - object_id_list, - object_type_list); - append_drc_violation (violation); - pcb_drc_violation_free (violation); - free (object_id_list); - free (object_type_list); - if (!throw_drc_dialog()) - { - IsBad = true; - break; - } - IncrementUndoSerialNumber (); - Undo (false); - } + if (PlowsPolygon (PCB->Data, VIA_TYPE, via, via, drc_callback, &info)) + { + IsBad = true; + break; + } + if (!TEST_FLAG (HOLEFLAG, via) && + via->Thickness - via->DrillingHole < 2 * PCB->minRing) + { + AddObjectToFlagUndoList (VIA_TYPE, via, via, via); + SET_FLAG (SELECTEDFLAG, via); + DrawVia (via); + drcerr_count++; + SetThing (VIA_TYPE, via, via, via); + LocateError (&x, &y); + BuildObjectList (&object_count, &object_id_list, + &object_type_list); + violation = pcb_drc_violation_new (_("Via annular ring too small"), _("Annular rings that are too small may erode during etching,\n" "resulting in a broken connection"), x, y, 0, /* ANGLE OF ERROR UNKNOWN */ + TRUE, /* MEASUREMENT OF ERROR KNOWN */ + (via->Thickness - + via->DrillingHole) / 2, + PCB->minRing, object_count, + object_id_list, + object_type_list); + append_drc_violation (violation); + pcb_drc_violation_free (violation); + free (object_id_list); + free (object_type_list); + if (!throw_drc_dialog ()) + { + IsBad = true; + break; + } + IncrementUndoSerialNumber (); + Undo (false); + } + if (via->DrillingHole < PCB->minDrill) + { + AddObjectToFlagUndoList (VIA_TYPE, via, via, via); + SET_FLAG (SELECTEDFLAG, via); + DrawVia (via); + drcerr_count++; + SetThing (VIA_TYPE, via, via, via); + LocateError (&x, &y); + BuildObjectList (&object_count, &object_id_list, + &object_type_list); + violation = pcb_drc_violation_new (_("Via drill size is too small"), _("Process rules dictate the minimum drill size which can be used"), x, y, 0, /* ANGLE OF ERROR UNKNOWN */ + TRUE, /* MEASUREMENT OF ERROR KNOWN */ + via->DrillingHole, + PCB->minDrill, + object_count, + object_id_list, + object_type_list); + append_drc_violation (violation); + pcb_drc_violation_free (violation); + free (object_id_list); + free (object_type_list); + if (!throw_drc_dialog ()) + { + IsBad = true; + break; + } + IncrementUndoSerialNumber (); + Undo (false); + } } END_LOOP; } @@ -3939,35 +3974,32 @@ DRCAll (void) { SILKLINE_LOOP (PCB->Data); { - if (line->Thickness < PCB->minSlk) - { - SET_FLAG (SELECTEDFLAG, line); - DrawLine (layer, line); - drcerr_count++; - SetThing (LINE_TYPE, layer, line, line); - LocateError (&x, &y); - BuildObjectList (&object_count, &object_id_list, &object_type_list); - violation = pcb_drc_violation_new (_("Silk line is too thin"), - _("Process specifications dictate a minimum silkscreen feature-width\n" - "that can reliably be reproduced"), - x, y, - 0, /* ANGLE OF ERROR UNKNOWN */ - TRUE, /* MEASUREMENT OF ERROR KNOWN */ - line->Thickness, - PCB->minSlk, - object_count, - object_id_list, - object_type_list); - append_drc_violation (violation); - pcb_drc_violation_free (violation); - free (object_id_list); - free (object_type_list); - if (!throw_drc_dialog()) - { - IsBad = true; - break; - } - } + if (line->Thickness < PCB->minSlk) + { + SET_FLAG (SELECTEDFLAG, line); + DrawLine (layer, line); + drcerr_count++; + SetThing (LINE_TYPE, layer, line, line); + LocateError (&x, &y); + BuildObjectList (&object_count, &object_id_list, + &object_type_list); + violation = pcb_drc_violation_new (_("Silk line is too thin"), _("Process specifications dictate a minimum silkscreen feature-width\n" "that can reliably be reproduced"), x, y, 0, /* ANGLE OF ERROR UNKNOWN */ + TRUE, /* MEASUREMENT OF ERROR KNOWN */ + line->Thickness, + PCB->minSlk, + object_count, + object_id_list, + object_type_list); + append_drc_violation (violation); + pcb_drc_violation_free (violation); + free (object_id_list); + free (object_type_list); + if (!throw_drc_dialog ()) + { + IsBad = true; + break; + } + } } ENDALL_LOOP; } @@ -3978,59 +4010,56 @@ DRCAll (void) { ELEMENT_LOOP (PCB->Data); { - tmpcnt = 0; - ELEMENTLINE_LOOP (element); - { - if (line->Thickness < PCB->minSlk) - tmpcnt++; - } - END_LOOP; - if (tmpcnt > 0) - { - char *title; - char *name; - char *buffer; - int buflen; - - SET_FLAG (SELECTEDFLAG, element); - DrawElement (element); - drcerr_count++; - SetThing (ELEMENT_TYPE, element, element, element); - LocateError (&x, &y); - BuildObjectList (&object_count, &object_id_list, &object_type_list); - - title = _("Element %s has %i silk lines which are too thin"); - name = (char *)UNKNOWN (NAMEONPCB_NAME (element)); - - /* -4 is for the %s and %i place-holders */ - /* +11 is the max printed length for a 32 bit integer */ - /* +1 is for the \0 termination */ - buflen = strlen (title) - 4 + strlen (name) + 11 + 1; - buffer = (char *)malloc (buflen); - snprintf (buffer, buflen, title, name, tmpcnt); - - violation = pcb_drc_violation_new (buffer, - _("Process specifications dictate a minimum silkscreen\n" - "feature-width that can reliably be reproduced"), - x, y, - 0, /* ANGLE OF ERROR UNKNOWN */ - TRUE, /* MEASUREMENT OF ERROR KNOWN */ - 0, /* MINIMUM OFFENDING WIDTH UNKNOWN */ - PCB->minSlk, - object_count, - object_id_list, - object_type_list); - free (buffer); - append_drc_violation (violation); - pcb_drc_violation_free (violation); - free (object_id_list); - free (object_type_list); - if (!throw_drc_dialog()) - { - IsBad = true; - break; - } - } + tmpcnt = 0; + ELEMENTLINE_LOOP (element); + { + if (line->Thickness < PCB->minSlk) + tmpcnt++; + } + END_LOOP; + if (tmpcnt > 0) + { + char *title; + char *name; + char *buffer; + int buflen; + + SET_FLAG (SELECTEDFLAG, element); + DrawElement (element); + drcerr_count++; + SetThing (ELEMENT_TYPE, element, element, element); + LocateError (&x, &y); + BuildObjectList (&object_count, &object_id_list, + &object_type_list); + + title = _("Element %s has %i silk lines which are too thin"); + name = (char *) UNKNOWN (NAMEONPCB_NAME (element)); + + /* -4 is for the %s and %i place-holders */ + /* +11 is the max printed length for a 32 bit integer */ + /* +1 is for the \0 termination */ + buflen = strlen (title) - 4 + strlen (name) + 11 + 1; + buffer = (char *) malloc (buflen); + snprintf (buffer, buflen, title, name, tmpcnt); + + violation = pcb_drc_violation_new (buffer, _("Process specifications dictate a minimum silkscreen\n" "feature-width that can reliably be reproduced"), x, y, 0, /* ANGLE OF ERROR UNKNOWN */ + TRUE, /* MEASUREMENT OF ERROR KNOWN */ + 0, /* MINIMUM OFFENDING WIDTH UNKNOWN */ + PCB->minSlk, + object_count, + object_id_list, + object_type_list); + free (buffer); + append_drc_violation (violation); + pcb_drc_violation_free (violation); + free (object_id_list); + free (object_type_list); + if (!throw_drc_dialog ()) + { + IsBad = true; + break; + } + } } END_LOOP; } @@ -4046,11 +4075,10 @@ DRCAll (void) hid_action ("LayersChanged"); gui->invalidate_all (); - if (nopastecnt > 0) + if (nopastecnt > 0) { Message (_("Warning: %d pad%s the nopaste flag set.\n"), - nopastecnt, - nopastecnt > 1 ? "s have" : " has"); + nopastecnt, nopastecnt > 1 ? "s have" : " has"); } return IsBad ? -drcerr_count : drcerr_count; } @@ -4059,56 +4087,56 @@ DRCAll (void) * Locate the coordinatates of offending item (thing) */ static void -LocateError (Coord *x, Coord *y) +LocateError (Coord * x, Coord * y) { switch (thing_type) { case LINE_TYPE: { - LineType *line = (LineType *) thing_ptr3; - *x = (line->Point1.X + line->Point2.X) / 2; - *y = (line->Point1.Y + line->Point2.Y) / 2; - break; + LineType *line = (LineType *) thing_ptr3; + *x = (line->Point1.X + line->Point2.X) / 2; + *y = (line->Point1.Y + line->Point2.Y) / 2; + break; } case ARC_TYPE: { - ArcType *arc = (ArcType *) thing_ptr3; - *x = arc->X; - *y = arc->Y; - break; + ArcType *arc = (ArcType *) thing_ptr3; + *x = arc->X; + *y = arc->Y; + break; } case POLYGON_TYPE: { - PolygonType *polygon = (PolygonType *) thing_ptr3; - *x = - (polygon->Clipped->contours->xmin + - polygon->Clipped->contours->xmax) / 2; - *y = - (polygon->Clipped->contours->ymin + - polygon->Clipped->contours->ymax) / 2; - break; + PolygonType *polygon = (PolygonType *) thing_ptr3; + *x = + (polygon->Clipped->contours->xmin + + polygon->Clipped->contours->xmax) / 2; + *y = + (polygon->Clipped->contours->ymin + + polygon->Clipped->contours->ymax) / 2; + break; } case PIN_TYPE: case VIA_TYPE: { - PinType *pin = (PinType *) thing_ptr3; - *x = pin->X; - *y = pin->Y; - break; + PinType *pin = (PinType *) thing_ptr3; + *x = pin->X; + *y = pin->Y; + break; } case PAD_TYPE: { - PadType *pad = (PadType *) thing_ptr3; - *x = (pad->Point1.X + pad->Point2.X) / 2; - *y = (pad->Point1.Y + pad->Point2.Y) / 2; - break; + PadType *pad = (PadType *) thing_ptr3; + *x = (pad->Point1.X + pad->Point2.X) / 2; + *y = (pad->Point1.Y + pad->Point2.Y) / 2; + break; } case ELEMENT_TYPE: { - ElementType *element = (ElementType *) thing_ptr3; - *x = element->MarkX; - *y = element->MarkY; - break; + ElementType *element = (ElementType *) thing_ptr3; + *x = element->MarkX; + *y = element->MarkY; + break; } default: return; @@ -4120,7 +4148,8 @@ LocateError (Coord *x, Coord *y) * Build a list of the of offending items by ID. (Currently just "thing") */ static void -BuildObjectList (int *object_count, long int **object_id_list, int **object_type_list) +BuildObjectList (int *object_count, long int **object_id_list, + int **object_type_list) { *object_count = 0; *object_id_list = NULL; @@ -4137,15 +4166,16 @@ BuildObjectList (int *object_count, long int **object_id_list, int **object_type case ELEMENT_TYPE: case RATLINE_TYPE: *object_count = 1; - *object_id_list = (long int *)malloc (sizeof (long int)); - *object_type_list = (int *)malloc (sizeof (int)); - **object_id_list = ((AnyObjectType *)thing_ptr3)->ID; + *object_id_list = (long int *) malloc (sizeof (long int)); + *object_type_list = (int *) malloc (sizeof (int)); + **object_id_list = ((AnyObjectType *) thing_ptr3)->ID; **object_type_list = thing_type; return; default: fprintf (stderr, - _("Internal error in BuildObjectList: unknown object type %i\n"), + _ + ("Internal error in BuildObjectList: unknown object type %i\n"), thing_type); } } @@ -4166,9 +4196,9 @@ GotoError (void) case LINE_TYPE: case ARC_TYPE: case POLYGON_TYPE: - ChangeGroupVisibility ( - GetLayerNumber (PCB->Data, (LayerType *) thing_ptr1), - true, true); + ChangeGroupVisibility (GetLayerNumber + (PCB->Data, (LayerType *) thing_ptr1), true, + true); } CenterDisplay (X, Y); } diff --git a/src/find.h b/src/find.h index 4cc68f8..bf7b064 100644 --- a/src/find.h +++ b/src/find.h @@ -59,5 +59,6 @@ void InitConnectionLookup (void); void FreeConnectionLookupMemory (void); void RatFindHook (int, void *, void *, void *, bool, int flag, bool); int DRCAll (void); +void LookupConnectionsByPin (int type, void *ptr1); #endif diff --git a/src/hid/ipcd356/hid.conf b/src/hid/ipcd356/hid.conf new file mode 100644 index 0000000..7be6c4c --- /dev/null +++ b/src/hid/ipcd356/hid.conf @@ -0,0 +1 @@ +type=export diff --git a/src/hid/ipcd356/ipcd356.c b/src/hid/ipcd356/ipcd356.c new file mode 100644 index 0000000..2590853 --- /dev/null +++ b/src/hid/ipcd356/ipcd356.c @@ -0,0 +1,709 @@ +/* + * COPYRIGHT + * + * PCB, interactive printed circuit board design + * + * IPC-D-356 Netlist export + * Copyright (C) 2012, 2013 Jerome Marchand (Jerome.Marchand@gmail.com) + * Copyright (C) 2012, 2013 PCB Contributors (see ChangeLog for details) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Contact addresses for paper mail and Email: + * Thomas Nau, Schlehenweg 15, 88471 Baustetten, Germany + * Thomas.Nau@rz.uni-ulm.de + * + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "data.h" +#include "config.h" +#include "global.h" +#include "rats.h" +#include "error.h" +#include "find.h" +#include "misc.h" +#include "ipcd356.h" +#include "pcb-printf.h" + +#include "hid.h" +#include "hid/common/hidnogui.h" +#include "../hidint.h" + +#ifdef HAVE_LIBDMALLOC +#include +#endif + +static HID_Attribute IPCD356_options[] = { +/* %start-doc options "8 IPC-D-356 Netlist Export" +@ftable @code +@item --netlist-file +Name of the IPC-D-356 Netlist output file. +@end ftable +%end-doc +*/ + { + "netlist-file", + "Name of the IPC-D-356 Netlist output file", + HID_String, + 0, 0, {0, 0, 0}, 0, 0}, +#define HA_IPCD356_filename 0 +}; + +#define NUM_OPTIONS (sizeof(IPCD356_options)/sizeof(IPCD356_options[0])) + +static HID_Attr_Val IPCD356_values[NUM_OPTIONS]; + +static const char *IPCD356_filename; + +static HID_Attribute * +IPCD356_get_export_options (int *n) +{ + static char *last_IPCD356_filename = NULL; + + if (PCB) + { + derive_default_filename (PCB->Filename, + &IPCD356_options[HA_IPCD356_filename], ".ipc", + &last_IPCD356_filename); + } + + if (n) + *n = NUM_OPTIONS; + return IPCD356_options; +} + +/** + * \brief Writes the IPC-D-356 Header to the file provided. + * + * The JOB name is the PCB Name (if set), otherwise the filename (including the path) is used. + * The units used for the netlist depends on what is set (mils or mm). + */ +void +IPCD356_WriteHeader (FILE * fd) +{ + time_t currenttime; + char utcTime[64]; + const char *fmt = "%c UTC"; + + currenttime = time (NULL); + strftime (utcTime, sizeof utcTime, fmt, gmtime (¤ttime)); + + fprintf (fd, + "C IPC-D-356 Netlist generated by gEDA PCB " VERSION "\nC \n"); + if (strcmp (IPCD356_filename, "ipcd356_test.ipc") != 0) // Skip the time stamp line when running the test. + fprintf (fd, "C File created on %s\nC \n", utcTime); + if (PCB->Name == NULL) + { + fprintf (fd, "P JOB %s\n", PCB->Filename); // Use the file name if the PCB name in not set + } + else + { + fprintf (fd, "P JOB %s\n", PCB->Name); + } + fprintf (fd, "P CODE 00\n"); + if (strcmp (Settings.grid_unit->suffix, "mil") == 0) + { // Use whatever unit is currently in use (mil or mm) + fprintf (fd, "P UNITS CUST 0\n"); + } + else + { + fprintf (fd, "P UNITS CUST 1\n"); + } + fprintf (fd, "P DIM N\n"); + fprintf (fd, "P VER IPC-D-356\n"); + fprintf (fd, "P IMAGE PRIMARY\nC \n"); +} + + +/** + * \brief Writes a net to the file provided. + * + * The net name is passed through the "net" and should be 14 characters max. + * The function scans through pads, pins and vias and looks for the FOUNDFLAG. + * Once the object has been added to the net list the VISITFLAG is set on that object. + * + * \todo FIXME: The bottom layer is always written as layer #2 (A02). + * It could output the actual layer number (example: A06 on a 6 layer board). + * But I could not find an easy way to do this... + * + * \todo FIXME: Objects with mutiple connections could have the "M" (column 32) field written + * to indicate a Mid Net Point. + */ +void +IPCD356_WriteNet (FILE * fd, char *net) +{ + int padx, pady, tmp; + + ELEMENT_LOOP (PCB->Data); + PAD_LOOP (element); + if (TEST_FLAG (FOUNDFLAG, pad)) + { + fprintf (fd, "327%-17.14s", net); // Net Name + fprintf (fd, "%-6.6s", element->Name[1].TextString); //Ref. des. + fprintf (fd, "-%-4.4s", pad->Number); // pin number + fprintf (fd, " "); // FIXME: midpoint indicator (M) + fprintf (fd, " "); // Drilled hole Id (blank for pads) + if (TEST_FLAG (ONSOLDERFLAG, pad) == true) + { + fprintf (fd, "A02"); // FIXME: put actual layer # for solder side + } + else + { + fprintf (fd, "A01"); // Component side + } + padx = (pad->Point1.X + pad->Point2.X) / 2; // X location in PCB units + pady = (PCB->MaxHeight - ((pad->Point1.Y + pad->Point2.Y) / 2)); // Y location in PCB units + + if (strcmp (Settings.grid_unit->suffix, "mil") == 0) + { + padx = padx / 2540; // X location in 0.0001" + pady = pady / 2540; // Y location in 0.0001" + } + else + { + padx = padx / 1000; // X location in 0.001mm + pady = pady / 1000; // Y location in 0.001mm + } + fprintf (fd, "X%+6.6d", padx); // X Pad center + fprintf (fd, "Y%+6.6d", pady); // Y pad center + padx = (pad->Thickness + (pad->Point2.X - pad->Point1.X)); // Pad dimension X in PCB units + pady = (pad->Thickness + (pad->Point2.Y - pad->Point1.Y)); // Pad dimension Y in PCB units + + if (strcmp (Settings.grid_unit->suffix, "mil") == 0) + { + padx = padx / 2540; // X location in 0.0001" + pady = pady / 2540; // Y location in 0.0001" + } + else + { + padx = padx / 1000; // X location in 0.001mm + pady = pady / 1000; // Y location in 0.001mm + } + + fprintf (fd, "X%4.4d", padx); + fprintf (fd, "Y%4.4d", pady); + fprintf (fd, "R000"); // Rotation (0 degrees) + fprintf (fd, " "); //colunm 72 should be left blank + if (pad->Mask > 0) + { + if (TEST_FLAG (ONSOLDERFLAG, pad) == true) + { + fprintf (fd, "S2"); // Soldermask on solder side + } + else + { + fprintf (fd, "S1"); // SolderMask on component side + } + } + else + { + fprintf (fd, "S3"); // No soldermask + } + fprintf (fd, " "); // padding + fprintf (fd, "\n"); + SET_FLAG (VISITFLAG, pad); + } + + END_LOOP; // Pad + PIN_LOOP (element); + if (TEST_FLAG (FOUNDFLAG, pin)) + { + if (TEST_FLAG (HOLEFLAG, pin)) + { // Non plated? + fprintf (fd, "367%-17.14s", net); // Net Name + } + else + { + fprintf (fd, "317%-17.14s", net); // Net Name + } + fprintf (fd, "%-6.6s", element->Name[1].TextString); //Refdes + fprintf (fd, "-%-4.4s", pin->Number); // pin number + fprintf (fd, " "); // FIXME: midpoint indicator (M) + tmp = pin->DrillingHole; + if (strcmp (Settings.grid_unit->suffix, "mil") == 0) + { + tmp = tmp / 2540; // 0.0001" + } + else + { + tmp = tmp / 1000; // 0.001mm + } + + if (TEST_FLAG (HOLEFLAG, pin)) + { + fprintf (fd, "D%-4.4dU", tmp); // Unplated Drilled hole Id + } + else + { + fprintf (fd, "D%-4.4dP", tmp); // Plated drill hole + } + fprintf (fd, "A00"); // Accessible from both sides + padx = pin->X; // X location in PCB units + pady = (PCB->MaxHeight - pin->Y); // Y location in PCB units + + if (strcmp (Settings.grid_unit->suffix, "mil") == 0) + { + padx = padx / 2540; // X location in 0.0001" + pady = pady / 2540; // Y location in 0.0001" + } + else + { + padx = padx / 1000; // X location in 0.001mm + pady = pady / 1000; // Y location in 0.001mm + } + + fprintf (fd, "X%+6.6d", padx); // X Pad center + fprintf (fd, "Y%+6.6d", pady); // Y pad center + + padx = pin->Thickness; + + if (strcmp (Settings.grid_unit->suffix, "mil") == 0) + { + padx = padx / 2540; // X location in 0.0001" + } + else + { + padx = padx / 1000; // X location in 0.001mm + } + + fprintf (fd, "X%4.4d", padx); // Pad dimension X + if (TEST_FLAG (SQUAREFLAG, pin)) + { + fprintf (fd, "Y%4.4d", padx); // Pad dimension Y + } + else + { + fprintf (fd, "Y0000"); // Y is 0 for round pins + } + fprintf (fd, "R000"); // Rotation (0 degrees) + fprintf (fd, " "); //colunm 72 should be left blank + if (pin->Mask > 0) + { + fprintf (fd, "S0"); // No Soldermask + } + else + { + fprintf (fd, "S3"); // Soldermask on both sides + } + fprintf (fd, " "); // padding + + fprintf (fd, "\n"); + + SET_FLAG (VISITFLAG, pin); + + } + + END_LOOP; // Pin + END_LOOP; //element + + VIA_LOOP (PCB->Data); + if (TEST_FLAG (FOUNDFLAG, via)) + { + if (TEST_FLAG (HOLEFLAG, via)) + { // Non plated? + fprintf (fd, "367%-17.14s", net); // Net Name + } + else + { + fprintf (fd, "317%-17.14s", net); // Net Name + } + fprintf (fd, "VIA "); //Ref. des. + fprintf (fd, "- "); // pin number + fprintf (fd, " "); // FIXME: midpoint indicator (M) + tmp = via->DrillingHole; + if (strcmp (Settings.grid_unit->suffix, "mil") == 0) + { + tmp = tmp / 2540; // 0.0001" + } + else + { + tmp = tmp / 1000; //0.001mm + } + + if (TEST_FLAG (HOLEFLAG, via)) + { + fprintf (fd, "D%-4.4dU", tmp); // Unplated Drilled hole Id + } + else + { + fprintf (fd, "D%-4.4dP", tmp); // Plated drill hole + } + fprintf (fd, "A00"); // Accessible from both sides + padx = via->X; // X location in PCB units + pady = (PCB->MaxHeight - via->Y); // Y location in PCB units + + if (strcmp (Settings.grid_unit->suffix, "mil") == 0) + { + padx = padx / 2540; // X location in 0.0001" + pady = pady / 2540; // Y location in 0.0001" + } + else + { + padx = padx / 1000; // X location in 0.001mm + pady = pady / 1000; // Y location in 0.001mm + } + + fprintf (fd, "X%+6.6d", padx); // X Pad center + fprintf (fd, "Y%+6.6d", pady); // Y pad center + + padx = via->Thickness; + + if (strcmp (Settings.grid_unit->suffix, "mil") == 0) + { + padx = padx / 2540; // X location in 0.0001" + } + else + { + padx = padx / 1000; // X location in 0.001mm + } + + fprintf (fd, "X%4.4d", padx); // Pad dimension X + fprintf (fd, "Y0000"); // Y is 0 for round pins (vias always round?) + fprintf (fd, "R000"); // Rotation (0 degrees) + fprintf (fd, " "); //colunm 72 should be left blank + if (via->Mask > 0) + { + fprintf (fd, "S0"); // No Soldermask + } + else + { + fprintf (fd, "S3"); // Soldermask on both sides + } + fprintf (fd, " "); // padding + fprintf (fd, "\n"); + SET_FLAG (VISITFLAG, via); + } + + END_LOOP; //Via +} + +/** + * \brief The main IPC-D-356 function. + * + * Gets the filename for the netlist from dialog. + */ +int +IPCD356_Netlist (void) +{ + FILE *fp; +// char *filename; + char *nodename; + char *net; + LibraryMenuType *netname; + IPCD356_AliasList *aliaslist; + + if (IPCD356_SanityCheck ()) + { // Check for empty element names + Message ("Aborting.\n"); + return (1); + } + + + fp = fopen (IPCD356_filename, "w+"); + if (fp == NULL) + { + Message ("error opening %s\n", IPCD356_filename); + return 1; + } + + IPCD356_WriteHeader (fp); + + aliaslist = CreateAliasList (); + if (aliaslist == NULL) + { + Message ("Error Aloccating memory for IPC-D-356 AliasList\n"); + return 1; + } + + if (IPCD356_WriteAliases (fp, aliaslist)) + { + Message ("Error Writing IPC-D-356 AliasList\n"); + return 1; + } + + ELEMENT_LOOP (PCB->Data); + PIN_LOOP (element); + if (!TEST_FLAG (VISITFLAG, pin)) + { +// ResetFoundLinesAndPolygons (false); +// ResetFoundPinsViasAndPads (false); + ClearFlagOnAllObjects (false, FOUNDFLAG); + LookupConnectionByPin (PIN_TYPE, pin); + nodename = + g_strdup_printf ("%s-%s", element->Name[1].TextString, pin->Number); + netname = netnode_to_netname (nodename); + g_free (nodename); +// Message("Netname: %s\n", netname->Name +2); + if (netname) + { + net = g_strdup_printf ("%s", &netname->Name[2]); + CheckNetName (net, aliaslist); + } + else + { + net = g_strdup_printf ("N/C"); + } + IPCD356_WriteNet (fp, net); + g_free (net); + } + END_LOOP; // pin + PAD_LOOP (element); + if (!TEST_FLAG (VISITFLAG, pad)) + { +// ResetFoundLinesAndPolygons (false); +// ResetFoundPinsViasAndPads (false); + ClearFlagOnAllObjects (false, FOUNDFLAG); + LookupConnectionByPin (PAD_TYPE, pad); + nodename = + g_strdup_printf ("%s-%s", element->Name[1].TextString, pad->Number); + netname = netnode_to_netname (nodename); + g_free (nodename); +// Message("Netname: %s\n", netname->Name +2); + if (netname) + { + net = g_strdup_printf ("%s", &netname->Name[2]); + CheckNetName (net, aliaslist); + } + else + { + net = g_strdup_printf ("N/C"); + } + IPCD356_WriteNet (fp, net); + g_free (net); + } + END_LOOP; // pad + END_LOOP; // element + + VIA_LOOP (PCB->Data); + if (!TEST_FLAG (VISITFLAG, via)) + { +// ResetFoundLinesAndPolygons (false); +// ResetFoundPinsViasAndPads (false); + ClearFlagOnAllObjects (false, FOUNDFLAG); + LookupConnectionByPin (PIN_TYPE, via); + IPCD356_WriteNet (fp, "N/C"); + } + END_LOOP; // via + + IPCD356_End (fp); + fclose (fp); + free (aliaslist); +// ResetVisitPinsViasAndPads (); +// ResetFoundLinesAndPolygons (false); +// ResetFoundPinsViasAndPads (false); + ClearFlagOnAllObjects (false, FOUNDFLAG); + ClearFlagOnAllObjects (false, VISITFLAG); + +// This is needed to prevent PCB from saving the database when running the test (from the test suite). +// The netlister is not modifying any data but somehow the flag gets set. +// Maybe the flag should be cleared all the time? + if (strcmp (IPCD356_filename, "ipcd356_test.ipc") == 0) + PCB->Changed = false; + + return 0; +} + +void +IPCD356_End (FILE * fd) +{ + fprintf (fd, "999\n"); +} + +void +ResetVisitPinsViasAndPads () +{ + VIA_LOOP (PCB->Data); + CLEAR_FLAG (VISITFLAG, via); + END_LOOP; + ELEMENT_LOOP (PCB->Data); + PIN_LOOP (element); + CLEAR_FLAG (VISITFLAG, pin); + END_LOOP; // pin + PAD_LOOP (element); + CLEAR_FLAG (VISITFLAG, pad); + END_LOOP; // pad + END_LOOP; // element +} + +int +IPCD356_WriteAliases (FILE * fd, IPCD356_AliasList * aliaslist) +{ + int index; + int i; + + index = 1; + + for (i = 0; i < PCB->NetlistLib.MenuN; i++) + { + if (strlen (PCB->NetlistLib.Menu[i].Name + 2) > 14) + { + if (index == 1) + { + fprintf (fd, "C Netname Aliases Section\n"); + } + aliaslist = AddAliasToList (aliaslist); + if (aliaslist == NULL) + { + return 1; + } + sprintf (aliaslist->Alias[index].NName, "NNAME%-5.5d", index); +// strcpy (aliaslist->Alias[index].NetName, +// PCB->NetlistLib.Menu[i].Name + 2); + aliaslist->Alias[index].NetName = + STRDUP (PCB->NetlistLib.Menu[i].Name + 2); + fprintf (fd, "P %s %-58.58s\n", aliaslist->Alias[index].NName, + aliaslist->Alias[index].NetName); + index++; + } + } + if (index > 1) + { + fprintf (fd, "C End Netname Aliases Section\nC \n"); + } + return 0; +} + +IPCD356_AliasList * +CreateAliasList () +{ + IPCD356_AliasList *aliaslist; + + aliaslist = malloc (sizeof (IPCD356_AliasList)); // create an alias list + aliaslist->AliasN = 0; // Initialize Number of Alias + return aliaslist; +} + +IPCD356_AliasList * +AddAliasToList (IPCD356_AliasList * aliaslist) +{ + aliaslist->AliasN++; + aliaslist->Alias = realloc (aliaslist->Alias, + sizeof (IPCD356_Alias) * (aliaslist->AliasN + + 1)); + if (aliaslist->Alias == NULL) + { + return NULL; + } + return aliaslist; +} + + +void +CheckNetName (char *net, IPCD356_AliasList * aliaslist) +{ + int i, Changed; + + if (strlen (net) > 14) + { + for (i = 1; i <= aliaslist->AliasN; i++) + { + if (strcmp (net, aliaslist->Alias[i].NetName) == 0) + { + strcpy (net, aliaslist->Alias[i].NName); + } + } + } + else + { + Changed = 0; + for (i = 0; i < strlen (net); i++) + { + if (net[i] == ' ') + { + net[i] = '_'; + Changed = 1; + } + } + if (Changed) + Message + ("Warning: IPC-D-356 does not allow Spaces in Net Names. Net Name changed to %s.\n", + net); + } +} + +int +IPCD356_SanityCheck () +{ + ELEMENT_LOOP (PCB->Data); + if (element->Name[1].TextString == '\0') + { + Message + ("Error: Found unmaned element. All elements need to be named to create an IPC-D-356 netlist.\n"); + return (1); + } + + END_LOOP; + return (0); +} + +static void +IPCD356_do_export (HID_Attr_Val * options) +{ + int i; + + if (!options) + { + IPCD356_get_export_options (0); + for (i = 0; i < NUM_OPTIONS; i++) + IPCD356_values[i] = IPCD356_options[i].default_val; + options = IPCD356_values; + } + + IPCD356_filename = options[HA_IPCD356_filename].str_value; + if (!IPCD356_filename) + IPCD356_filename = "pcb-out-IPC-D-356.net"; + + IPCD356_Netlist (); +} + +static void +IPCD356_parse_arguments (int *argc, char ***argv) +{ + hid_register_attributes (IPCD356_options, + sizeof (IPCD356_options) / + sizeof (IPCD356_options[0])); + hid_parse_command_line (argc, argv); +} + +HID IPCD356_hid; + +void +hid_ipcd356_init () +{ + memset (&IPCD356_hid, 0, sizeof (HID)); + + common_nogui_init (&IPCD356_hid); + + IPCD356_hid.struct_size = sizeof (HID); + IPCD356_hid.name = "IPC-D-356"; + IPCD356_hid.description = "Exports a IPC-D-356 Netlist"; + IPCD356_hid.exporter = 1; + + IPCD356_hid.get_export_options = IPCD356_get_export_options; + IPCD356_hid.do_export = IPCD356_do_export; + IPCD356_hid.parse_arguments = IPCD356_parse_arguments; + + hid_register_hid (&IPCD356_hid); +} + +/* EOF */ diff --git a/src/hid/ipcd356/ipcd356.h b/src/hid/ipcd356/ipcd356.h new file mode 100644 index 0000000..47812cc --- /dev/null +++ b/src/hid/ipcd356/ipcd356.h @@ -0,0 +1,55 @@ +/* + * COPYRIGHT + * + * PCB, interactive printed circuit board design + * + * IPC-D-356 Netlist export + * Copyright (C) 2012, 2013 Jerome Marchand (Jerome.Marchand@gmail.com) + * Copyright (C) 2012, 2013 PCB Contributors (see ChangeLog for details) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Contact addresses for paper mail and Email: + * Thomas Nau, Schlehenweg 15, 88471 Baustetten, Germany + * Thomas.Nau@rz.uni-ulm.de + * + * + */ + + +typedef struct +{ + char NName[11]; // Per IPC Spec: Alias is 'NNAME' + 5 Chars, (+Termination) + char * NetName; +} IPCD356_Alias; + +typedef struct +{ + int AliasN; //number of entries + IPCD356_Alias *Alias; +} IPCD356_AliasList; + +void IPCD356_WriteNet (FILE *, char *); +void IPCD356_WriteHeader (FILE *); +void IPCD356_End (FILE *); +int IPCD356_Netlist (void); +int IPCD356_WriteAliases (FILE *, IPCD356_AliasList *); +void ResetVisitPinsViasAndPads (void); +void CheckNetName (char *, IPCD356_AliasList *); +IPCD356_AliasList * CreateAliasList (void); +IPCD356_AliasList * AddAliasToList (IPCD356_AliasList * aliaslist); +int IPCD356_SanityCheck(void); + +/* EOF */ diff --git a/tests/golden/Makefile.am b/tests/golden/Makefile.am index 424b4df..2b08042 100644 --- a/tests/golden/Makefile.am +++ b/tests/golden/Makefile.am @@ -21,4 +21,6 @@ SUBDIRS= \ hid_gerber3 \ hid_png1 \ hid_png2 \ - hid_png3 + hid_png3 \ + hid_ipcd356 + diff --git a/tests/golden/hid_ipcd356/Makefile.am b/tests/golden/hid_ipcd356/Makefile.am new file mode 100644 index 0000000..d6c1421 --- /dev/null +++ b/tests/golden/hid_ipcd356/Makefile.am @@ -0,0 +1,4 @@ +## -*- makefile -*- + +EXTRA_DIST= \ + ipcd356_test.ipc diff --git a/tests/golden/hid_ipcd356/ipcd356_test.ipc b/tests/golden/hid_ipcd356/ipcd356_test.ipc new file mode 100644 index 0000000..d85d9d1 --- /dev/null +++ b/tests/golden/hid_ipcd356/ipcd356_test.ipc @@ -0,0 +1,208 @@ +C IPC-D-356 Netlist generated by gEDA PCB 1.99z +C +P JOB ipcd356.pcb +P CODE 00 +P UNITS CUST 0 +P DIM N +P VER IPC-D-356 +P IMAGE PRIMARY +C +C Netname Aliases Section +P NNAME00001 THISIS15CHARACT +P NNAME00002 THISISAREALLYLONGNETNAMEITS60CHARACTERSLONG>>>>>>>>>>>>>>> +C End Netname Aliases Section +C +317N/C X1 -1 D0280PA00X+023300Y+024500X0600Y0000R000 S0 +317DGND X1 -2 D0280PA00X+026300Y+024500X0600Y0000R000 S0 +317DGND U6 -4 D0280PA00X+010050Y+027050X0600Y0000R000 S0 +317DGND U5 -5 D0280PA00X+015950Y+024400X0600Y0000R000 S0 +317DGND C17 -1 D0350PA00X+021550Y+024850X0800Y0000R000 S0 +327DGND C13 -2 A01X+025250Y+018800X0600Y0600R000 S1 +327DGND C16 -2 A01X+011700Y+019450X0600Y0600R000 S1 +327DGND C14 -2 A01X+011750Y+015200X0600Y0600R000 S1 +317DGND C15 -2 D0350PA00X+012800Y+017150X0800Y0000R000 S0 +327DGND C10 -2 A01X+021850Y+019900X0600Y0600R000 S1 +317DGND C12 -2 D0350PA00X+025450Y+019800X0800Y0000R000 S0 +327DGND U3 -2 A01X+022355Y+017530X0390Y0240R000 S1 +327DGND U3 -5 A01X+023615Y+017530X0390Y0240R000 S1 +327DGND U4 -2 A01X+011795Y+017470X0390Y0240R000 S1 +327DGND U4 -5 A01X+010535Y+017470X0390Y0240R000 S1 +327DGND C5 -2 A01X+014050Y+019850X0600Y0600R000 S1 +327DGND C11 -2 A01X+021800Y+018800X0600Y0600R000 S1 +317DGND C9 -2 D0350PA00X+022300Y+021150X0800Y0000R000 S0 +317DGND R7 -2 D0280PA00X+020550Y+012350X0600Y0000R000 S0 +317DGND C8 -2 D0350PA00X+022300Y+022250X0800Y0000R000 S0 +317DGND C7 -2 D0350PA00X+013300Y+022250X0800Y0000R000 S0 +317DGND C6 -2 D0350PA00X+013300Y+021150X0800Y0000R000 S0 +317DGND R9 -2 D0280PA00X+020550Y+011300X0600Y0000R000 S0 +317DGND R10 -2 D0280PA00X+021600Y+012250X0600Y0000R000 S0 +327DGND U2 -6 A01X+017580Y+016100X0120Y0720R000 S1 +327DGND U2 -7 A01X+017840Y+016100X0120Y0720R000 S1 +327DGND U2 -8 A01X+018090Y+016100X0120Y0720R000 S1 +327DGND U2 -9 A01X+018350Y+016100X0120Y0720R000 S1 +327DGND U2 -14 A01X+019630Y+016100X0120Y0720R000 S1 +327DGND U2 -18 A01X+018860Y+019300X0120Y0720R000 S1 +327DGND U2 -19 A01X+018600Y+019300X0120Y0720R000 S1 +317DGND C21 -2 D0350PA00X+023650Y+022300X0800Y0000R000 S0 +327DGND C20 -2 A01X+025750Y+009250X0600Y0600R000 S1 +317DGND J3 -1 D0420PA00X+008200Y+012580X0800Y0800R000 S0 +317DGND U7 -4 D0280PA00X+025750Y+010750X0600Y0000R000 S0 +317DGND VIA - D0280PA00X+020750Y+018450X0500Y0000R000 S0 +317DGND VIA - D0280PA00X+017900Y+017300X0500Y0000R000 S0 +317DGND VIA - D0280PA00X+014500Y+017250X0500Y0000R000 S0 +317SIG191 X1 -3 D0280PA00X+026300Y+027500X0600Y0000R000 S0 +317SIG191 U5 -16 D0280PA00X+013950Y+027400X0600Y0000R000 S0 +317SIG321 X1 -4 D0280PA00X+023300Y+027500X0600Y0000R000 S0 +317SIG321 U6 -1000 D0280PA00X+010050Y+024050X0600Y0600R000 S0 +317SIG321 U5 -14 D0280PA00X+015950Y+027400X0600Y0000R000 S0 +317SIG321 C17 -2 D0350PA00X+021550Y+026850X0800Y0000R000 S0 +327SIG321 C16 -1 A01X+010800Y+019450X0600Y0600R000 S1 +317SIG321 R13 -2 D0280PA00X+015300Y+018650X0600Y0000R000 S0 +327SIG321 U4 -4 A01X+010535Y+017850X0390Y0240R000 S1 +327SIG321 C5 -1 A01X+014950Y+019850X0600Y0600R000 S1 +317SIG321 C7 -1 D0350PA00X+015300Y+022250X0800Y0000R000 S0 +317SIG321 C6 -1 D0350PA00X+015300Y+021150X0800Y0000R000 S0 +327SIG321 U2 -28 A01X+016300Y+019300X0120Y0720R000 S1 +317SIG321 VIA - D0280PA00X+010700Y+020350X0500Y0000R000 S0 +317SIG259 U6 -2 D0280PA00X+010050Y+025050X0600Y0000R000 S0 +317SIG259 U5 -17 D0280PA00X+012950Y+027400X0600Y0000R000 S0 +317SIG258 U6 -3 D0280PA00X+010050Y+026050X0600Y0000R000 S0 +317SIG258 U5 -18 D0280PA00X+011950Y+027400X0600Y0000R000 S0 +317SIG296 U6 -5 D0280PA00X+007050Y+027050X0600Y0000R000 S0 +317SIG296 J3 -2 D0420PA00X+008200Y+013660X0800Y0000R000 S0 +317SIG297 U6 -6 D0280PA00X+007050Y+026050X0600Y0000R000 S0 +317SIG297 J3 -3 D0420PA00X+008200Y+014740X0800Y0000R000 S0 +317SIG285 U6 -7 D0280PA00X+007050Y+025050X0600Y0000R000 S0 +317SIG285 R14 -1 D0280PA00X+011050Y+022250X0600Y0000R000 S0 +317SIG285 J3 -4 D0420PA00X+008200Y+015820X0800Y0000R000 S0 +317SIG286 U6 -8 D0280PA00X+007050Y+024050X0600Y0000R000 S0 +317SIG286 R14 -2 D0280PA00X+007050Y+022250X0600Y0000R000 S0 +317SIG286 J3 -5 D0420PA00X+008200Y+016900X0800Y0000R000 S0 +317N/C U5 -1 D0280PA00X+011950Y+024400X0600Y0600R000 S0 +317N/C U5 -2 D0280PA00X+012950Y+024400X0600Y0000R000 S0 +317N/C U5 -3 D0280PA00X+013950Y+024400X0600Y0000R000 S0 +317SIG252 U5 -4 D0280PA00X+014950Y+024400X0600Y0000R000 S0 +317SIG252 R13 -1 D0280PA00X+011300Y+018650X0600Y0600R000 S0 +327SIG252 U4 -3 A01X+011795Y+017850X0390Y0240R000 S1 +317SIG294 U5 -6 D0280PA00X+016950Y+024400X0600Y0000R000 S0 +327SIG294 U2 -25 A01X+017070Y+019300X0120Y0720R000 S1 +317SIG293 U5 -7 D0280PA00X+017950Y+024400X0600Y0000R000 S0 +327SIG293 U2 -24 A01X+017320Y+019300X0120Y0720R000 S1 +317SIG292 U5 -8 D0280PA00X+018950Y+024400X0600Y0000R000 S0 +327SIG292 U2 -23 A01X+017580Y+019300X0120Y0720R000 S1 +317SIG291 U5 -9 D0280PA00X+019950Y+024400X0600Y0000R000 S0 +327SIG291 U2 -22 A01X+017840Y+019300X0120Y0720R000 S1 +317SIG101 U5 -10 D0280PA00X+019950Y+027400X0600Y0000R000 S0 +327SIG101 U2 -20 A01X+018350Y+019300X0120Y0720R000 S1 +317SIG100 U5 -11 D0280PA00X+018950Y+027400X0600Y0000R000 S0 +327SIG100 U2 -21 A01X+018090Y+019300X0120Y0720R000 S1 +317N/C U5 -12 D0280PA00X+017950Y+027400X0600Y0000R000 S0 +317N/C U5 -13 D0280PA00X+016950Y+027400X0600Y0000R000 S0 +317SIG241 U5 -15 D0280PA00X+014950Y+027400X0600Y0000R000 S0 +327SIG241 U2 -26 A01X+016810Y+019300X0120Y0720R000 S1 +327S00001 C13 -1 A01X+025250Y+017900X0600Y0600R000 S1 +327S00001 C10 -1 A01X+020950Y+019900X0600Y0600R000 S1 +327S00001 U3 -4 A01X+023615Y+017150X0390Y0240R000 S1 +317S00001 C9 -1 D0350PA00X+020300Y+021150X0800Y0000R000 S0 +317S00001 C8 -1 D0350PA00X+020300Y+022250X0800Y0000R000 S0 +317S00001 R6 -1 D0280PA00X+023750Y+016200X0600Y0600R000 S0 +317S00001 R8 -1 D0280PA00X+022700Y+016200X0600Y0600R000 S0 +327S00001 U2 -15 A01X+019630Y+019300X0120Y0720R000 S1 +327S00001 U2 -17 A01X+019110Y+019300X0120Y0720R000 S1 +317S00001 R2 -2 D0280PA00X+024000Y+010750X0600Y0000R000 S0 +327S00001 C18 -1 A01X+026650Y+015000X0600Y0600R000 S1 +317S00001 U7 -1 D0280PA00X+025750Y+013750X0600Y0600R000 S0 +317S00001 U7 -7 D0280PA00X+028750Y+012750X0600Y0000R000 S0 +327SIG155 C14 -1 A01X+011750Y+016100X0600Y0600R000 S1 +327SIG155 U4 -1 A01X+011795Y+017100X0390Y0240R000 S1 +317SIG150 C15 -1 D0350PA00X+012800Y+015150X0800Y0000R000 S0 +327SIG150 U4 -6 A01X+010535Y+017100X0390Y0240R000 S1 +317SIG150 R12 -1 D0480PA00X+010350Y+013650X0850Y0850R000 S0 +317SIG146 C12 -1 D0350PA00X+023450Y+019800X0800Y0000R000 S0 +317SIG146 R11 -2 D0480PA00X+028150Y+024000X0850Y0000R000 S0 +327SIG146 U3 -6 A01X+023615Y+017900X0390Y0240R000 S1 +317Plus12V R11 -1 D0480PA00X+028150Y+016000X0850Y0850R000 S0 +317Plus12V U1 -7 D0280PA00X+013550Y+010150X0600Y0000R000 S0 +317Plus12V U1 -11 D0280PA00X+014550Y+007150X0600Y0000R000 S0 +317Plus12V J3 -6 D0420PA00X+007080Y+013120X0800Y0000R000 S0 +317Plus12V R12 -2 D0480PA00X+010350Y+005650X0900Y0000R000 S0 +327SIG139 U3 -1 A01X+022355Y+017900X0390Y0240R000 S1 +327SIG139 C11 -1 A01X+022700Y+018800X0600Y0600R000 S1 +327N/C U3 -3 A01X+022355Y+017150X0390Y0240R000 S1 +317THISIS_13_CHA R7 -1 D0280PA00X+016550Y+012350X0600Y0000R000 S0 +317THISIS_13_CHA C2 -1 D0350PA00X+019450Y+014550X0800Y0800R000 S0 +317THISIS_13_CHA R6 -2 D0280PA00X+023750Y+012200X0600Y0000R000 S0 +327THISIS_13_CHA U2 -4 A01X+017070Y+016100X0120Y0720R000 S1 +317THISIS_13_CHA R4 -2 D0280PA00X+020150Y+013450X0600Y0000R000 S0 +317NNAME00002 C2 -2 D0350PA00X+017450Y+014550X0800Y0000R000 S0 +327NNAME00002 U2 -3 A01X+016810Y+016100X0120Y0720R000 S1 +317NNAME00002 R4 -1 D0280PA00X+016150Y+013450X0600Y0600R000 S0 +317NNAME00002 U1 -5 D0280PA00X+015550Y+010150X0600Y0000R000 S0 +317SIG_51 C1 -1 D0350PA00X+014900Y+013500X0800Y0800R000 S0 +317SIG_51 R8 -2 D0280PA00X+022700Y+012200X0600Y0000R000 S0 +317SIG_51 R5 -2 D0280PA00X+013750Y+011500X0600Y0000R000 S0 +317SIG_51 R9 -1 D0280PA00X+016550Y+011300X0600Y0000R000 S0 +327SIG_51 U2 -2 A01X+016560Y+016100X0120Y0720R000 S1 +317SIG52 C1 -2 D0350PA00X+014900Y+015500X0800Y0000R000 S0 +317SIG52 R5 -1 D0280PA00X+013750Y+015500X0600Y0600R000 S0 +327SIG52 U2 -1 A01X+016300Y+016100X0120Y0720R000 S1 +317SIG52 U1 -12 D0280PA00X+015550Y+007150X0600Y0000R000 S0 +317SIG52 VIA - D0280PA00X+011850Y+006400X0500Y0000R000 S0 +317SIG310 R10 -1 D0280PA00X+021600Y+016250X0600Y0600R000 S0 +327SIG310 U2 -5 A01X+017320Y+016100X0120Y0720R000 S1 +317SIG310 J1 -1 D0480PA00X+022850Y+003750X1100Y0000R000 S0 +327SIG87 U2 -10 A01X+018600Y+016100X0120Y0720R000 S1 +327SIG87 U2 -11 A01X+018860Y+016100X0120Y0720R000 S1 +327SIG88 U2 -12 A01X+019110Y+016100X0120Y0720R000 S1 +327SIG88 U2 -13 A01X+019370Y+016100X0120Y0720R000 S1 +327SIG91 U2 -16 A01X+019370Y+019300X0120Y0720R000 S1 +317SIG91 C21 -1 D0350PA00X+025650Y+022300X0800Y0000R000 S0 +327SIG91 C20 -1 A01X+026650Y+009250X0600Y0600R000 S1 +327SIG91 C19 -1 A01X+027850Y+009250X0600Y0600R000 S1 +317SIG91 U7 -2 D0280PA00X+025750Y+012750X0600Y0000R000 S0 +317SIG91 U7 -6 D0280PA00X+028750Y+011750X0600Y0000R000 S0 +317SIG91 VIA - D0280PA00X+019850Y+020000X0500Y0000R000 S0 +327N/C U2 -27 A01X+016560Y+019300X0120Y0720R000 S1 +327Minus12V C4 -1 A01X+020700Y+009100X0600Y0600R000 S1 +317Minus12V U1 -6 D0280PA00X+014550Y+010150X0600Y0000R000 S0 +327Minus12V C3 -1 A01X+020750Y+007900X0600Y0600R000 S1 +317Minus12V J3 -9 D0420PA00X+007080Y+016360X0800Y0000R000 S0 +327THISIS12CHAR C4 -2 A01X+020700Y+010000X0600Y0600R000 S1 +317THISIS12CHAR R1 -2 D0280PA00X+021800Y+010750X0600Y0000R000 S0 +317THISIS12CHAR U1 -1 D0280PA00X+019550Y+010150X0600Y0600R000 S0 +317SIG338 R1 -1 D0280PA00X+021800Y+006750X0600Y0600R000 S0 +317SIG338 R2 -1 D0280PA00X+024000Y+006750X0600Y0600R000 S0 +317SIG338 R3 -1 D0280PA00X+022900Y+006750X0600Y0600R000 S0 +317SIG338 U7 -3 D0280PA00X+025750Y+011750X0600Y0000R000 S0 +317THISIS14CHARAC U1 -2 D0280PA00X+018550Y+010150X0600Y0000R000 S0 +317THISIS14CHARAC U1 -8 D0280PA00X+012550Y+010150X0600Y0000R000 S0 +317THISIS14CHARAC U1 -15 D0280PA00X+018550Y+007150X0600Y0000R000 S0 +317SIG125 U1 -3 D0280PA00X+017550Y+010150X0600Y0000R000 S0 +317SIG125 J2 -2 D0480PA00X+015010Y+003750X1100Y0000R000 S0 +317SIG125 VIA - D0280PA00X+016050Y+006400X0500Y0000R000 S0 +317SIG124 U1 -4 D0280PA00X+016550Y+010150X0600Y0000R000 S0 +317SIG124 J2 -3 D0480PA00X+013070Y+003750X1100Y0000R000 S0 +317SIG124 VIA - D0280PA00X+015200Y+008050X0500Y0000R000 S0 +317N/C U1 -9 D0280PA00X+012550Y+007150X0600Y0000R000 S0 +317N/C U1 -10 D0280PA00X+013550Y+007150X0600Y0000R000 S0 +317SIG311 U1 -13 D0280PA00X+016550Y+007150X0600Y0000R000 S0 +317SIG311 J1 -3 D0480PA00X+018970Y+003750X1100Y0000R000 S0 +317SIG127 U1 -14 D0280PA00X+017550Y+007150X0600Y0000R000 S0 +317SIG127 J1 -2 D0480PA00X+020910Y+003750X1100Y0000R000 S0 +317NNAME00001 U1 -16 D0280PA00X+019550Y+007150X0600Y0000R000 S0 +317NNAME00001 R3 -2 D0280PA00X+022900Y+010750X0600Y0000R000 S0 +327NNAME00001 C3 -2 A01X+020750Y+007000X0600Y0600R000 S1 +317N/C J2 -1 D0480PA00X+016950Y+003750X1100Y0000R000 S0 +327SIG343 C19 -2 A01X+028750Y+009250X0600Y0600R000 S1 +317SIG343 U7 -5 D0280PA00X+028750Y+010750X0600Y0000R000 S0 +327SIG341 C18 -2 A01X+027550Y+015000X0600Y0600R000 S1 +317SIG341 U7 -8 D0280PA00X+028750Y+013750X0600Y0000R000 S0 +317N/C J3 -7 D0420PA00X+007080Y+014200X0800Y0000R000 S0 +317N/C J3 -8 D0420PA00X+007080Y+015280X0800Y0000R000 S0 +367N/C J3 -10 D1200UA00X+007640Y+019660X1200Y0000R000 S0 +367N/C J3 -11 D1200UA00X+007640Y+009820X1200Y0000R000 S0 +367N/C VIA - D1100UA00X+004650Y+002850X1100Y0000R000 S0 +367N/C VIA - D1100UA00X+004650Y+026950X1100Y0000R000 S0 +367N/C VIA - D1100UA00X+029650Y+027050X1100Y0000R000 S0 +367N/C VIA - D1100UA00X+029650Y+002950X1100Y0000R000 S0 +999 diff --git a/tests/inputs/Makefile.am b/tests/inputs/Makefile.am index 5ead192..8b7d55a 100644 --- a/tests/inputs/Makefile.am +++ b/tests/inputs/Makefile.am @@ -4,5 +4,6 @@ EXTRA_DIST= \ bom_general.pcb \ gcode_oneline.pcb \ gerber_oneline.pcb \ - gerber_arcs.pcb + gerber_arcs.pcb \ + ipcd356.pcb diff --git a/tests/inputs/ipcd356.pcb b/tests/inputs/ipcd356.pcb new file mode 100644 index 0000000..7f354c3 --- /dev/null +++ b/tests/inputs/ipcd356.pcb @@ -0,0 +1,2141 @@ +# release: pcb 1.99z + +# To read pcb files, the pcb version (or the git source date) must be >= the file version +FileVersion[20091103] + +PCB["" 3500.00mil 3300.00mil] + +Grid[3900.000000 18.00mil 1.00mil 1] +PolyArea[3100.006200] +Thermal[0.500000] +DRC[10.00mil 10.00mil 10.00mil 10.00mil 15.00mil 10.00mil] +Flags("rubberband,nameonpcb,alldirection,uniquename,snappin") +Groups("4,5,6,c:1,2,3,s:8:7") +Styles["Signal,10.00mil,40.00mil,20.00mil,10.00mil:Power,25.00mil,60.00mil,35.00mil,10.00mil:Fat,40.00mil,60.00mil,35.00mil,10.00mil:Skinny,8.00mil,36.00mil,20.00mil,10.00mil"] + +Symbol[' ' 18.00mil] +( +) +Symbol['!' 12.00mil] +( + SymbolLine[0.0000 35.00mil 0.0000 40.00mil 8.00mil] + SymbolLine[0.0000 0.0000 0.0000 25.00mil 8.00mil] +) +Symbol['"' 12.00mil] +( + SymbolLine[0.0000 0.0000 0.0000 10.00mil 8.00mil] + SymbolLine[10.00mil 0.0000 10.00mil 10.00mil 8.00mil] +) +Symbol['#' 12.00mil] +( + SymbolLine[0.0000 25.00mil 20.00mil 25.00mil 8.00mil] + SymbolLine[0.0000 15.00mil 20.00mil 15.00mil 8.00mil] + SymbolLine[15.00mil 10.00mil 15.00mil 30.00mil 8.00mil] + SymbolLine[5.00mil 10.00mil 5.00mil 30.00mil 8.00mil] +) +Symbol['$' 12.00mil] +( + SymbolLine[15.00mil 5.00mil 20.00mil 10.00mil 8.00mil] + SymbolLine[5.00mil 5.00mil 15.00mil 5.00mil 8.00mil] + SymbolLine[0.0000 10.00mil 5.00mil 5.00mil 8.00mil] + SymbolLine[0.0000 10.00mil 0.0000 15.00mil 8.00mil] + SymbolLine[0.0000 15.00mil 5.00mil 20.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 15.00mil 20.00mil 8.00mil] + SymbolLine[15.00mil 20.00mil 20.00mil 25.00mil 8.00mil] + SymbolLine[20.00mil 25.00mil 20.00mil 30.00mil 8.00mil] + SymbolLine[15.00mil 35.00mil 20.00mil 30.00mil 8.00mil] + SymbolLine[5.00mil 35.00mil 15.00mil 35.00mil 8.00mil] + SymbolLine[0.0000 30.00mil 5.00mil 35.00mil 8.00mil] + SymbolLine[10.00mil 0.0000 10.00mil 40.00mil 8.00mil] +) +Symbol['%' 12.00mil] +( + SymbolLine[0.0000 5.00mil 0.0000 10.00mil 8.00mil] + SymbolLine[0.0000 5.00mil 5.00mil 0.0000 8.00mil] + SymbolLine[5.00mil 0.0000 10.00mil 0.0000 8.00mil] + SymbolLine[10.00mil 0.0000 15.00mil 5.00mil 8.00mil] + SymbolLine[15.00mil 5.00mil 15.00mil 10.00mil 8.00mil] + SymbolLine[10.00mil 15.00mil 15.00mil 10.00mil 8.00mil] + SymbolLine[5.00mil 15.00mil 10.00mil 15.00mil 8.00mil] + SymbolLine[0.0000 10.00mil 5.00mil 15.00mil 8.00mil] + SymbolLine[0.0000 40.00mil 40.00mil 0.0000 8.00mil] + SymbolLine[35.00mil 40.00mil 40.00mil 35.00mil 8.00mil] + SymbolLine[40.00mil 30.00mil 40.00mil 35.00mil 8.00mil] + SymbolLine[35.00mil 25.00mil 40.00mil 30.00mil 8.00mil] + SymbolLine[30.00mil 25.00mil 35.00mil 25.00mil 8.00mil] + SymbolLine[25.00mil 30.00mil 30.00mil 25.00mil 8.00mil] + SymbolLine[25.00mil 30.00mil 25.00mil 35.00mil 8.00mil] + SymbolLine[25.00mil 35.00mil 30.00mil 40.00mil 8.00mil] + SymbolLine[30.00mil 40.00mil 35.00mil 40.00mil 8.00mil] +) +Symbol['&' 12.00mil] +( + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 5.00mil 0.0000 15.00mil 8.00mil] + SymbolLine[0.0000 5.00mil 5.00mil 0.0000 8.00mil] + SymbolLine[0.0000 25.00mil 15.00mil 10.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 10.00mil 40.00mil 8.00mil] + SymbolLine[10.00mil 40.00mil 20.00mil 30.00mil 8.00mil] + SymbolLine[0.0000 15.00mil 25.00mil 40.00mil 8.00mil] + SymbolLine[5.00mil 0.0000 10.00mil 0.0000 8.00mil] + SymbolLine[10.00mil 0.0000 15.00mil 5.00mil 8.00mil] + SymbolLine[15.00mil 5.00mil 15.00mil 10.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 0.0000 35.00mil 8.00mil] +) +Symbol[''' 12.00mil] +( + SymbolLine[0.0000 10.00mil 10.00mil 0.0000 8.00mil] +) +Symbol['(' 12.00mil] +( + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 5.00mil 5.00mil 0.0000 8.00mil] + SymbolLine[0.0000 5.00mil 0.0000 35.00mil 8.00mil] +) +Symbol[')' 12.00mil] +( + SymbolLine[0.0000 0.0000 5.00mil 5.00mil 8.00mil] + SymbolLine[5.00mil 5.00mil 5.00mil 35.00mil 8.00mil] + SymbolLine[0.0000 40.00mil 5.00mil 35.00mil 8.00mil] +) +Symbol['*' 12.00mil] +( + SymbolLine[0.0000 10.00mil 20.00mil 30.00mil 8.00mil] + SymbolLine[0.0000 30.00mil 20.00mil 10.00mil 8.00mil] + SymbolLine[0.0000 20.00mil 20.00mil 20.00mil 8.00mil] + SymbolLine[10.00mil 10.00mil 10.00mil 30.00mil 8.00mil] +) +Symbol['+' 12.00mil] +( + SymbolLine[0.0000 20.00mil 20.00mil 20.00mil 8.00mil] + SymbolLine[10.00mil 10.00mil 10.00mil 30.00mil 8.00mil] +) +Symbol[',' 12.00mil] +( + SymbolLine[0.0000 50.00mil 10.00mil 40.00mil 8.00mil] +) +Symbol['-' 12.00mil] +( + SymbolLine[0.0000 20.00mil 20.00mil 20.00mil 8.00mil] +) +Symbol['.' 12.00mil] +( + SymbolLine[0.0000 40.00mil 5.00mil 40.00mil 8.00mil] +) +Symbol['/' 12.00mil] +( + SymbolLine[0.0000 35.00mil 30.00mil 5.00mil 8.00mil] +) +Symbol['0' 12.00mil] +( + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 5.00mil 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 5.00mil 5.00mil 0.0000 8.00mil] + SymbolLine[5.00mil 0.0000 15.00mil 0.0000 8.00mil] + SymbolLine[15.00mil 0.0000 20.00mil 5.00mil 8.00mil] + SymbolLine[20.00mil 5.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[15.00mil 40.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 15.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 30.00mil 20.00mil 10.00mil 8.00mil] +) +Symbol['1' 12.00mil] +( + SymbolLine[5.00mil 40.00mil 15.00mil 40.00mil 8.00mil] + SymbolLine[10.00mil 0.0000 10.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 10.00mil 10.00mil 0.0000 8.00mil] +) +Symbol['2' 12.00mil] +( + SymbolLine[0.0000 5.00mil 5.00mil 0.0000 8.00mil] + SymbolLine[5.00mil 0.0000 20.00mil 0.0000 8.00mil] + SymbolLine[20.00mil 0.0000 25.00mil 5.00mil 8.00mil] + SymbolLine[25.00mil 5.00mil 25.00mil 15.00mil 8.00mil] + SymbolLine[0.0000 40.00mil 25.00mil 15.00mil 8.00mil] + SymbolLine[0.0000 40.00mil 25.00mil 40.00mil 8.00mil] +) +Symbol['3' 12.00mil] +( + SymbolLine[0.0000 5.00mil 5.00mil 0.0000 8.00mil] + SymbolLine[5.00mil 0.0000 15.00mil 0.0000 8.00mil] + SymbolLine[15.00mil 0.0000 20.00mil 5.00mil 8.00mil] + SymbolLine[20.00mil 5.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[15.00mil 40.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 15.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 20.00mil 20.00mil 8.00mil] +) +Symbol['4' 12.00mil] +( + SymbolLine[0.0000 20.00mil 20.00mil 0.0000 8.00mil] + SymbolLine[0.0000 20.00mil 25.00mil 20.00mil 8.00mil] + SymbolLine[20.00mil 0.0000 20.00mil 40.00mil 8.00mil] +) +Symbol['5' 12.00mil] +( + SymbolLine[0.0000 0.0000 20.00mil 0.0000 8.00mil] + SymbolLine[0.0000 0.0000 0.0000 20.00mil 8.00mil] + SymbolLine[0.0000 20.00mil 5.00mil 15.00mil 8.00mil] + SymbolLine[5.00mil 15.00mil 15.00mil 15.00mil 8.00mil] + SymbolLine[15.00mil 15.00mil 20.00mil 20.00mil 8.00mil] + SymbolLine[20.00mil 20.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[15.00mil 40.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 15.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] +) +Symbol['6' 12.00mil] +( + SymbolLine[15.00mil 0.0000 20.00mil 5.00mil 8.00mil] + SymbolLine[5.00mil 0.0000 15.00mil 0.0000 8.00mil] + SymbolLine[0.0000 5.00mil 5.00mil 0.0000 8.00mil] + SymbolLine[0.0000 5.00mil 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[15.00mil 20.00mil 20.00mil 25.00mil 8.00mil] + SymbolLine[0.0000 20.00mil 15.00mil 20.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 15.00mil 40.00mil 8.00mil] + SymbolLine[15.00mil 40.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[20.00mil 25.00mil 20.00mil 35.00mil 8.00mil] +) +Symbol['7' 12.00mil] +( + SymbolLine[0.0000 40.00mil 25.00mil 15.00mil 8.00mil] + SymbolLine[25.00mil 0.0000 25.00mil 15.00mil 8.00mil] + SymbolLine[0.0000 0.0000 25.00mil 0.0000 8.00mil] +) +Symbol['8' 12.00mil] +( + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 5.00mil 20.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 15.00mil 20.00mil 8.00mil] + SymbolLine[15.00mil 20.00mil 20.00mil 25.00mil 8.00mil] + SymbolLine[20.00mil 25.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[15.00mil 40.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 15.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 15.00mil 5.00mil 20.00mil 8.00mil] + SymbolLine[0.0000 5.00mil 0.0000 15.00mil 8.00mil] + SymbolLine[0.0000 5.00mil 5.00mil 0.0000 8.00mil] + SymbolLine[5.00mil 0.0000 15.00mil 0.0000 8.00mil] + SymbolLine[15.00mil 0.0000 20.00mil 5.00mil 8.00mil] + SymbolLine[20.00mil 5.00mil 20.00mil 15.00mil 8.00mil] + SymbolLine[15.00mil 20.00mil 20.00mil 15.00mil 8.00mil] +) +Symbol['9' 12.00mil] +( + SymbolLine[0.0000 40.00mil 20.00mil 20.00mil 8.00mil] + SymbolLine[20.00mil 5.00mil 20.00mil 20.00mil 8.00mil] + SymbolLine[15.00mil 0.0000 20.00mil 5.00mil 8.00mil] + SymbolLine[5.00mil 0.0000 15.00mil 0.0000 8.00mil] + SymbolLine[0.0000 5.00mil 5.00mil 0.0000 8.00mil] + SymbolLine[0.0000 5.00mil 0.0000 15.00mil 8.00mil] + SymbolLine[0.0000 15.00mil 5.00mil 20.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 20.00mil 20.00mil 8.00mil] +) +Symbol[':' 12.00mil] +( + SymbolLine[0.0000 15.00mil 5.00mil 15.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 5.00mil 25.00mil 8.00mil] +) +Symbol[';' 12.00mil] +( + SymbolLine[0.0000 40.00mil 10.00mil 30.00mil 8.00mil] + SymbolLine[10.00mil 15.00mil 10.00mil 20.00mil 8.00mil] +) +Symbol['<' 12.00mil] +( + SymbolLine[0.0000 20.00mil 10.00mil 10.00mil 8.00mil] + SymbolLine[0.0000 20.00mil 10.00mil 30.00mil 8.00mil] +) +Symbol['=' 12.00mil] +( + SymbolLine[0.0000 15.00mil 20.00mil 15.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 20.00mil 25.00mil 8.00mil] +) +Symbol['>' 12.00mil] +( + SymbolLine[0.0000 10.00mil 10.00mil 20.00mil 8.00mil] + SymbolLine[0.0000 30.00mil 10.00mil 20.00mil 8.00mil] +) +Symbol['?' 12.00mil] +( + SymbolLine[10.00mil 20.00mil 10.00mil 25.00mil 8.00mil] + SymbolLine[10.00mil 35.00mil 10.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 5.00mil 0.0000 10.00mil 8.00mil] + SymbolLine[0.0000 5.00mil 5.00mil 0.0000 8.00mil] + SymbolLine[5.00mil 0.0000 15.00mil 0.0000 8.00mil] + SymbolLine[15.00mil 0.0000 20.00mil 5.00mil 8.00mil] + SymbolLine[20.00mil 5.00mil 20.00mil 10.00mil 8.00mil] + SymbolLine[10.00mil 20.00mil 20.00mil 10.00mil 8.00mil] +) +Symbol['A' 12.00mil] +( + SymbolLine[0.0000 5.00mil 0.0000 40.00mil 8.00mil] + SymbolLine[0.0000 5.00mil 5.00mil 0.0000 8.00mil] + SymbolLine[5.00mil 0.0000 20.00mil 0.0000 8.00mil] + SymbolLine[20.00mil 0.0000 25.00mil 5.00mil 8.00mil] + SymbolLine[25.00mil 5.00mil 25.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 20.00mil 25.00mil 20.00mil 8.00mil] +) +Symbol['B' 12.00mil] +( + SymbolLine[0.0000 40.00mil 20.00mil 40.00mil 8.00mil] + SymbolLine[20.00mil 40.00mil 25.00mil 35.00mil 8.00mil] + SymbolLine[25.00mil 25.00mil 25.00mil 35.00mil 8.00mil] + SymbolLine[20.00mil 20.00mil 25.00mil 25.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 20.00mil 20.00mil 8.00mil] + SymbolLine[5.00mil 0.0000 5.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 0.0000 20.00mil 0.0000 8.00mil] + SymbolLine[20.00mil 0.0000 25.00mil 5.00mil 8.00mil] + SymbolLine[25.00mil 5.00mil 25.00mil 15.00mil 8.00mil] + SymbolLine[20.00mil 20.00mil 25.00mil 15.00mil 8.00mil] +) +Symbol['C' 12.00mil] +( + SymbolLine[5.00mil 40.00mil 20.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 5.00mil 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 5.00mil 5.00mil 0.0000 8.00mil] + SymbolLine[5.00mil 0.0000 20.00mil 0.0000 8.00mil] +) +Symbol['D' 12.00mil] +( + SymbolLine[5.00mil 0.0000 5.00mil 40.00mil 8.00mil] + SymbolLine[20.00mil 0.0000 25.00mil 5.00mil 8.00mil] + SymbolLine[25.00mil 5.00mil 25.00mil 35.00mil 8.00mil] + SymbolLine[20.00mil 40.00mil 25.00mil 35.00mil 8.00mil] + SymbolLine[0.0000 40.00mil 20.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 0.0000 20.00mil 0.0000 8.00mil] +) +Symbol['E' 12.00mil] +( + SymbolLine[0.0000 20.00mil 15.00mil 20.00mil 8.00mil] + SymbolLine[0.0000 40.00mil 20.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 0.0000 0.0000 40.00mil 8.00mil] + SymbolLine[0.0000 0.0000 20.00mil 0.0000 8.00mil] +) +Symbol['F' 12.00mil] +( + SymbolLine[0.0000 0.0000 0.0000 40.00mil 8.00mil] + SymbolLine[0.0000 0.0000 20.00mil 0.0000 8.00mil] + SymbolLine[0.0000 20.00mil 15.00mil 20.00mil 8.00mil] +) +Symbol['G' 12.00mil] +( + SymbolLine[20.00mil 0.0000 25.00mil 5.00mil 8.00mil] + SymbolLine[5.00mil 0.0000 20.00mil 0.0000 8.00mil] + SymbolLine[0.0000 5.00mil 5.00mil 0.0000 8.00mil] + SymbolLine[0.0000 5.00mil 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 20.00mil 40.00mil 8.00mil] + SymbolLine[20.00mil 40.00mil 25.00mil 35.00mil 8.00mil] + SymbolLine[25.00mil 25.00mil 25.00mil 35.00mil 8.00mil] + SymbolLine[20.00mil 20.00mil 25.00mil 25.00mil 8.00mil] + SymbolLine[10.00mil 20.00mil 20.00mil 20.00mil 8.00mil] +) +Symbol['H' 12.00mil] +( + SymbolLine[0.0000 0.0000 0.0000 40.00mil 8.00mil] + SymbolLine[25.00mil 0.0000 25.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 20.00mil 25.00mil 20.00mil 8.00mil] +) +Symbol['I' 12.00mil] +( + SymbolLine[0.0000 0.0000 10.00mil 0.0000 8.00mil] + SymbolLine[5.00mil 0.0000 5.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 40.00mil 10.00mil 40.00mil 8.00mil] +) +Symbol['J' 12.00mil] +( + SymbolLine[0.0000 0.0000 15.00mil 0.0000 8.00mil] + SymbolLine[15.00mil 0.0000 15.00mil 35.00mil 8.00mil] + SymbolLine[10.00mil 40.00mil 15.00mil 35.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 10.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] +) +Symbol['K' 12.00mil] +( + SymbolLine[0.0000 0.0000 0.0000 40.00mil 8.00mil] + SymbolLine[0.0000 20.00mil 20.00mil 0.0000 8.00mil] + SymbolLine[0.0000 20.00mil 20.00mil 40.00mil 8.00mil] +) +Symbol['L' 12.00mil] +( + SymbolLine[0.0000 0.0000 0.0000 40.00mil 8.00mil] + SymbolLine[0.0000 40.00mil 20.00mil 40.00mil 8.00mil] +) +Symbol['M' 12.00mil] +( + SymbolLine[0.0000 0.0000 0.0000 40.00mil 8.00mil] + SymbolLine[0.0000 0.0000 15.00mil 15.00mil 8.00mil] + SymbolLine[15.00mil 15.00mil 30.00mil 0.0000 8.00mil] + SymbolLine[30.00mil 0.0000 30.00mil 40.00mil 8.00mil] +) +Symbol['N' 12.00mil] +( + SymbolLine[0.0000 0.0000 0.0000 40.00mil 8.00mil] + SymbolLine[0.0000 0.0000 0.0000 5.00mil 8.00mil] + SymbolLine[0.0000 5.00mil 25.00mil 30.00mil 8.00mil] + SymbolLine[25.00mil 0.0000 25.00mil 40.00mil 8.00mil] +) +Symbol['O' 12.00mil] +( + SymbolLine[0.0000 5.00mil 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 5.00mil 5.00mil 0.0000 8.00mil] + SymbolLine[5.00mil 0.0000 15.00mil 0.0000 8.00mil] + SymbolLine[15.00mil 0.0000 20.00mil 5.00mil 8.00mil] + SymbolLine[20.00mil 5.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[15.00mil 40.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 15.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] +) +Symbol['P' 12.00mil] +( + SymbolLine[5.00mil 0.0000 5.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 0.0000 20.00mil 0.0000 8.00mil] + SymbolLine[20.00mil 0.0000 25.00mil 5.00mil 8.00mil] + SymbolLine[25.00mil 5.00mil 25.00mil 15.00mil 8.00mil] + SymbolLine[20.00mil 20.00mil 25.00mil 15.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 20.00mil 20.00mil 8.00mil] +) +Symbol['Q' 12.00mil] +( + SymbolLine[0.0000 5.00mil 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 5.00mil 5.00mil 0.0000 8.00mil] + SymbolLine[5.00mil 0.0000 15.00mil 0.0000 8.00mil] + SymbolLine[15.00mil 0.0000 20.00mil 5.00mil 8.00mil] + SymbolLine[20.00mil 5.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[15.00mil 40.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 15.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[10.00mil 30.00mil 20.00mil 40.00mil 8.00mil] +) +Symbol['R' 12.00mil] +( + SymbolLine[0.0000 0.0000 20.00mil 0.0000 8.00mil] + SymbolLine[20.00mil 0.0000 25.00mil 5.00mil 8.00mil] + SymbolLine[25.00mil 5.00mil 25.00mil 15.00mil 8.00mil] + SymbolLine[20.00mil 20.00mil 25.00mil 15.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 20.00mil 20.00mil 8.00mil] + SymbolLine[5.00mil 0.0000 5.00mil 40.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 25.00mil 40.00mil 8.00mil] +) +Symbol['S' 12.00mil] +( + SymbolLine[20.00mil 0.0000 25.00mil 5.00mil 8.00mil] + SymbolLine[5.00mil 0.0000 20.00mil 0.0000 8.00mil] + SymbolLine[0.0000 5.00mil 5.00mil 0.0000 8.00mil] + SymbolLine[0.0000 5.00mil 0.0000 15.00mil 8.00mil] + SymbolLine[0.0000 15.00mil 5.00mil 20.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 20.00mil 20.00mil 8.00mil] + SymbolLine[20.00mil 20.00mil 25.00mil 25.00mil 8.00mil] + SymbolLine[25.00mil 25.00mil 25.00mil 35.00mil 8.00mil] + SymbolLine[20.00mil 40.00mil 25.00mil 35.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 20.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] +) +Symbol['T' 12.00mil] +( + SymbolLine[0.0000 0.0000 20.00mil 0.0000 8.00mil] + SymbolLine[10.00mil 0.0000 10.00mil 40.00mil 8.00mil] +) +Symbol['U' 12.00mil] +( + SymbolLine[0.0000 0.0000 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 15.00mil 40.00mil 8.00mil] + SymbolLine[15.00mil 40.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[20.00mil 0.0000 20.00mil 35.00mil 8.00mil] +) +Symbol['V' 12.00mil] +( + SymbolLine[0.0000 0.0000 0.0000 30.00mil 8.00mil] + SymbolLine[0.0000 30.00mil 10.00mil 40.00mil 8.00mil] + SymbolLine[10.00mil 40.00mil 20.00mil 30.00mil 8.00mil] + SymbolLine[20.00mil 0.0000 20.00mil 30.00mil 8.00mil] +) +Symbol['W' 12.00mil] +( + SymbolLine[0.0000 0.0000 0.0000 40.00mil 8.00mil] + SymbolLine[0.0000 40.00mil 15.00mil 25.00mil 8.00mil] + SymbolLine[15.00mil 25.00mil 30.00mil 40.00mil 8.00mil] + SymbolLine[30.00mil 0.0000 30.00mil 40.00mil 8.00mil] +) +Symbol['X' 12.00mil] +( + SymbolLine[0.0000 0.0000 0.0000 5.00mil 8.00mil] + SymbolLine[0.0000 5.00mil 25.00mil 30.00mil 8.00mil] + SymbolLine[25.00mil 30.00mil 25.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 30.00mil 0.0000 40.00mil 8.00mil] + SymbolLine[0.0000 30.00mil 25.00mil 5.00mil 8.00mil] + SymbolLine[25.00mil 0.0000 25.00mil 5.00mil 8.00mil] +) +Symbol['Y' 12.00mil] +( + SymbolLine[0.0000 0.0000 0.0000 5.00mil 8.00mil] + SymbolLine[0.0000 5.00mil 10.00mil 15.00mil 8.00mil] + SymbolLine[10.00mil 15.00mil 20.00mil 5.00mil 8.00mil] + SymbolLine[20.00mil 0.0000 20.00mil 5.00mil 8.00mil] + SymbolLine[10.00mil 15.00mil 10.00mil 40.00mil 8.00mil] +) +Symbol['Z' 12.00mil] +( + SymbolLine[0.0000 0.0000 25.00mil 0.0000 8.00mil] + SymbolLine[25.00mil 0.0000 25.00mil 5.00mil 8.00mil] + SymbolLine[0.0000 30.00mil 25.00mil 5.00mil 8.00mil] + SymbolLine[0.0000 30.00mil 0.0000 40.00mil 8.00mil] + SymbolLine[0.0000 40.00mil 25.00mil 40.00mil 8.00mil] +) +Symbol['[' 12.00mil] +( + SymbolLine[0.0000 0.0000 5.00mil 0.0000 8.00mil] + SymbolLine[0.0000 0.0000 0.0000 40.00mil 8.00mil] + SymbolLine[0.0000 40.00mil 5.00mil 40.00mil 8.00mil] +) +Symbol['\' 12.00mil] +( + SymbolLine[0.0000 5.00mil 30.00mil 35.00mil 8.00mil] +) +Symbol[']' 12.00mil] +( + SymbolLine[0.0000 0.0000 5.00mil 0.0000 8.00mil] + SymbolLine[5.00mil 0.0000 5.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 40.00mil 5.00mil 40.00mil 8.00mil] +) +Symbol['^' 12.00mil] +( + SymbolLine[0.0000 5.00mil 5.00mil 0.0000 8.00mil] + SymbolLine[5.00mil 0.0000 10.00mil 5.00mil 8.00mil] +) +Symbol['_' 12.00mil] +( + SymbolLine[0.0000 40.00mil 20.00mil 40.00mil 8.00mil] +) +Symbol['a' 12.00mil] +( + SymbolLine[15.00mil 20.00mil 20.00mil 25.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 15.00mil 20.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 5.00mil 20.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[20.00mil 20.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[20.00mil 35.00mil 25.00mil 40.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 15.00mil 40.00mil 8.00mil] + SymbolLine[15.00mil 40.00mil 20.00mil 35.00mil 8.00mil] +) +Symbol['b' 12.00mil] +( + SymbolLine[0.0000 0.0000 0.0000 40.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 15.00mil 40.00mil 8.00mil] + SymbolLine[15.00mil 40.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[20.00mil 25.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[15.00mil 20.00mil 20.00mil 25.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 15.00mil 20.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 5.00mil 20.00mil 8.00mil] +) +Symbol['c' 12.00mil] +( + SymbolLine[5.00mil 20.00mil 20.00mil 20.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 5.00mil 20.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 20.00mil 40.00mil 8.00mil] +) +Symbol['d' 12.00mil] +( + SymbolLine[20.00mil 0.0000 20.00mil 40.00mil 8.00mil] + SymbolLine[15.00mil 40.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 15.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 5.00mil 20.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 15.00mil 20.00mil 8.00mil] + SymbolLine[15.00mil 20.00mil 20.00mil 25.00mil 8.00mil] +) +Symbol['e' 12.00mil] +( + SymbolLine[5.00mil 40.00mil 20.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 5.00mil 20.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 15.00mil 20.00mil 8.00mil] + SymbolLine[15.00mil 20.00mil 20.00mil 25.00mil 8.00mil] + SymbolLine[0.0000 30.00mil 20.00mil 30.00mil 8.00mil] + SymbolLine[20.00mil 30.00mil 20.00mil 25.00mil 8.00mil] +) +Symbol['f' 10.00mil] +( + SymbolLine[5.00mil 5.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[5.00mil 5.00mil 10.00mil 0.0000 8.00mil] + SymbolLine[10.00mil 0.0000 15.00mil 0.0000 8.00mil] + SymbolLine[0.0000 20.00mil 10.00mil 20.00mil 8.00mil] +) +Symbol['g' 12.00mil] +( + SymbolLine[15.00mil 20.00mil 20.00mil 25.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 15.00mil 20.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 5.00mil 20.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 15.00mil 40.00mil 8.00mil] + SymbolLine[15.00mil 40.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[0.0000 50.00mil 5.00mil 55.00mil 8.00mil] + SymbolLine[5.00mil 55.00mil 15.00mil 55.00mil 8.00mil] + SymbolLine[15.00mil 55.00mil 20.00mil 50.00mil 8.00mil] + SymbolLine[20.00mil 20.00mil 20.00mil 50.00mil 8.00mil] +) +Symbol['h' 12.00mil] +( + SymbolLine[0.0000 0.0000 0.0000 40.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 5.00mil 20.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 15.00mil 20.00mil 8.00mil] + SymbolLine[15.00mil 20.00mil 20.00mil 25.00mil 8.00mil] + SymbolLine[20.00mil 25.00mil 20.00mil 40.00mil 8.00mil] +) +Symbol['i' 10.00mil] +( + SymbolLine[0.0000 10.00mil 0.0000 15.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 0.0000 40.00mil 8.00mil] +) +Symbol['j' 10.00mil] +( + SymbolLine[5.00mil 10.00mil 5.00mil 15.00mil 8.00mil] + SymbolLine[5.00mil 25.00mil 5.00mil 50.00mil 8.00mil] + SymbolLine[0.0000 55.00mil 5.00mil 50.00mil 8.00mil] +) +Symbol['k' 12.00mil] +( + SymbolLine[0.0000 0.0000 0.0000 40.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 15.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 10.00mil 15.00mil 8.00mil] +) +Symbol['l' 10.00mil] +( + SymbolLine[0.0000 0.0000 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] +) +Symbol['m' 12.00mil] +( + SymbolLine[5.00mil 25.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[5.00mil 25.00mil 10.00mil 20.00mil 8.00mil] + SymbolLine[10.00mil 20.00mil 15.00mil 20.00mil 8.00mil] + SymbolLine[15.00mil 20.00mil 20.00mil 25.00mil 8.00mil] + SymbolLine[20.00mil 25.00mil 20.00mil 40.00mil 8.00mil] + SymbolLine[20.00mil 25.00mil 25.00mil 20.00mil 8.00mil] + SymbolLine[25.00mil 20.00mil 30.00mil 20.00mil 8.00mil] + SymbolLine[30.00mil 20.00mil 35.00mil 25.00mil 8.00mil] + SymbolLine[35.00mil 25.00mil 35.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 20.00mil 5.00mil 25.00mil 8.00mil] +) +Symbol['n' 12.00mil] +( + SymbolLine[5.00mil 25.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[5.00mil 25.00mil 10.00mil 20.00mil 8.00mil] + SymbolLine[10.00mil 20.00mil 15.00mil 20.00mil 8.00mil] + SymbolLine[15.00mil 20.00mil 20.00mil 25.00mil 8.00mil] + SymbolLine[20.00mil 25.00mil 20.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 20.00mil 5.00mil 25.00mil 8.00mil] +) +Symbol['o' 12.00mil] +( + SymbolLine[0.0000 25.00mil 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 5.00mil 20.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 15.00mil 20.00mil 8.00mil] + SymbolLine[15.00mil 20.00mil 20.00mil 25.00mil 8.00mil] + SymbolLine[20.00mil 25.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[15.00mil 40.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 15.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] +) +Symbol['p' 12.00mil] +( + SymbolLine[5.00mil 25.00mil 5.00mil 55.00mil 8.00mil] + SymbolLine[0.0000 20.00mil 5.00mil 25.00mil 8.00mil] + SymbolLine[5.00mil 25.00mil 10.00mil 20.00mil 8.00mil] + SymbolLine[10.00mil 20.00mil 20.00mil 20.00mil 8.00mil] + SymbolLine[20.00mil 20.00mil 25.00mil 25.00mil 8.00mil] + SymbolLine[25.00mil 25.00mil 25.00mil 35.00mil 8.00mil] + SymbolLine[20.00mil 40.00mil 25.00mil 35.00mil 8.00mil] + SymbolLine[10.00mil 40.00mil 20.00mil 40.00mil 8.00mil] + SymbolLine[5.00mil 35.00mil 10.00mil 40.00mil 8.00mil] +) +Symbol['q' 12.00mil] +( + SymbolLine[20.00mil 25.00mil 20.00mil 55.00mil 8.00mil] + SymbolLine[15.00mil 20.00mil 20.00mil 25.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 15.00mil 20.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 5.00mil 20.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 15.00mil 40.00mil 8.00mil] + SymbolLine[15.00mil 40.00mil 20.00mil 35.00mil 8.00mil] +) +Symbol['r' 12.00mil] +( + SymbolLine[5.00mil 25.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[5.00mil 25.00mil 10.00mil 20.00mil 8.00mil] + SymbolLine[10.00mil 20.00mil 20.00mil 20.00mil 8.00mil] + SymbolLine[0.0000 20.00mil 5.00mil 25.00mil 8.00mil] +) +Symbol['s' 12.00mil] +( + SymbolLine[5.00mil 40.00mil 20.00mil 40.00mil 8.00mil] + SymbolLine[20.00mil 40.00mil 25.00mil 35.00mil 8.00mil] + SymbolLine[20.00mil 30.00mil 25.00mil 35.00mil 8.00mil] + SymbolLine[5.00mil 30.00mil 20.00mil 30.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 5.00mil 30.00mil 8.00mil] + SymbolLine[0.0000 25.00mil 5.00mil 20.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 20.00mil 20.00mil 8.00mil] + SymbolLine[20.00mil 20.00mil 25.00mil 25.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] +) +Symbol['t' 10.00mil] +( + SymbolLine[5.00mil 0.0000 5.00mil 35.00mil 8.00mil] + SymbolLine[5.00mil 35.00mil 10.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 15.00mil 10.00mil 15.00mil 8.00mil] +) +Symbol['u' 12.00mil] +( + SymbolLine[0.0000 20.00mil 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 15.00mil 40.00mil 8.00mil] + SymbolLine[15.00mil 40.00mil 20.00mil 35.00mil 8.00mil] + SymbolLine[20.00mil 20.00mil 20.00mil 35.00mil 8.00mil] +) +Symbol['v' 12.00mil] +( + SymbolLine[0.0000 20.00mil 0.0000 30.00mil 8.00mil] + SymbolLine[0.0000 30.00mil 10.00mil 40.00mil 8.00mil] + SymbolLine[10.00mil 40.00mil 20.00mil 30.00mil 8.00mil] + SymbolLine[20.00mil 20.00mil 20.00mil 30.00mil 8.00mil] +) +Symbol['w' 12.00mil] +( + SymbolLine[0.0000 20.00mil 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 10.00mil 40.00mil 8.00mil] + SymbolLine[10.00mil 40.00mil 15.00mil 35.00mil 8.00mil] + SymbolLine[15.00mil 20.00mil 15.00mil 35.00mil 8.00mil] + SymbolLine[15.00mil 35.00mil 20.00mil 40.00mil 8.00mil] + SymbolLine[20.00mil 40.00mil 25.00mil 40.00mil 8.00mil] + SymbolLine[25.00mil 40.00mil 30.00mil 35.00mil 8.00mil] + SymbolLine[30.00mil 20.00mil 30.00mil 35.00mil 8.00mil] +) +Symbol['x' 12.00mil] +( + SymbolLine[0.0000 20.00mil 20.00mil 40.00mil 8.00mil] + SymbolLine[0.0000 40.00mil 20.00mil 20.00mil 8.00mil] +) +Symbol['y' 12.00mil] +( + SymbolLine[0.0000 20.00mil 0.0000 35.00mil 8.00mil] + SymbolLine[0.0000 35.00mil 5.00mil 40.00mil 8.00mil] + SymbolLine[20.00mil 20.00mil 20.00mil 50.00mil 8.00mil] + SymbolLine[15.00mil 55.00mil 20.00mil 50.00mil 8.00mil] + SymbolLine[5.00mil 55.00mil 15.00mil 55.00mil 8.00mil] + SymbolLine[0.0000 50.00mil 5.00mil 55.00mil 8.00mil] + SymbolLine[5.00mil 40.00mil 15.00mil 40.00mil 8.00mil] + SymbolLine[15.00mil 40.00mil 20.00mil 35.00mil 8.00mil] +) +Symbol['z' 12.00mil] +( + SymbolLine[0.0000 20.00mil 20.00mil 20.00mil 8.00mil] + SymbolLine[0.0000 40.00mil 20.00mil 20.00mil 8.00mil] + SymbolLine[0.0000 40.00mil 20.00mil 40.00mil 8.00mil] +) +Symbol['{' 12.00mil] +( + SymbolLine[5.00mil 5.00mil 10.00mil 0.0000 8.00mil] + SymbolLine[5.00mil 5.00mil 5.00mil 15.00mil 8.00mil] + SymbolLine[0.0000 20.00mil 5.00mil 15.00mil 8.00mil] + SymbolLine[0.0000 20.00mil 5.00mil 25.00mil 8.00mil] + SymbolLine[5.00mil 25.00mil 5.00mil 35.00mil 8.00mil] + SymbolLine[5.00mil 35.00mil 10.00mil 40.00mil 8.00mil] +) +Symbol['|' 12.00mil] +( + SymbolLine[0.0000 0.0000 0.0000 40.00mil 8.00mil] +) +Symbol['}' 12.00mil] +( + SymbolLine[0.0000 0.0000 5.00mil 5.00mil 8.00mil] + SymbolLine[5.00mil 5.00mil 5.00mil 15.00mil 8.00mil] + SymbolLine[5.00mil 15.00mil 10.00mil 20.00mil 8.00mil] + SymbolLine[5.00mil 25.00mil 10.00mil 20.00mil 8.00mil] + SymbolLine[5.00mil 25.00mil 5.00mil 35.00mil 8.00mil] + SymbolLine[0.0000 40.00mil 5.00mil 35.00mil 8.00mil] +) +Symbol['~' 12.00mil] +( + SymbolLine[0.0000 25.00mil 5.00mil 20.00mil 8.00mil] + SymbolLine[5.00mil 20.00mil 10.00mil 20.00mil 8.00mil] + SymbolLine[10.00mil 20.00mil 15.00mil 25.00mil 8.00mil] + SymbolLine[15.00mil 25.00mil 20.00mil 25.00mil 8.00mil] + SymbolLine[20.00mil 25.00mil 25.00mil 20.00mil 8.00mil] +) +Attribute("PCB::grid::unit" "mil") +Via[2075.00mil 1455.00mil 50.00mil 30.00mil 80.00mil 28.00mil "" "thermal(1,4)"] +Via[1790.00mil 1570.00mil 50.00mil 30.00mil 80.00mil 28.00mil "" "thermal(1,4)"] +Via[1450.00mil 1575.00mil 50.00mil 30.00mil 80.00mil 28.00mil "" "thermal(1,4)"] +Via[1070.00mil 1265.00mil 50.00mil 30.00mil 80.00mil 28.00mil "" ""] +Via[1520.00mil 2495.00mil 50.00mil 30.00mil 80.00mil 28.00mil "" ""] +Via[465.00mil 3015.00mil 110.00mil 30.00mil 140.00mil 110.00mil "" "hole"] +Via[1605.00mil 2660.00mil 50.00mil 30.00mil 80.00mil 28.00mil "" ""] +Via[1985.00mil 1300.00mil 50.00mil 30.00mil 80.00mil 28.00mil "" ""] +Via[465.00mil 605.00mil 110.00mil 30.00mil 140.00mil 110.00mil "" "hole"] +Via[2965.00mil 595.00mil 110.00mil 30.00mil 140.00mil 110.00mil "" "hole"] +Via[2965.00mil 3005.00mil 110.00mil 30.00mil 140.00mil 110.00mil "" "hole"] +Via[1185.00mil 2660.00mil 50.00mil 30.00mil 80.00mil 28.00mil "" ""] + +Element["" "" "X1" "" 2330.00mil 850.00mil 0.0000 0.0000 0 100 ""] +( + Pin[0.0000 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "" "1" ""] + Pin[300.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "" "2" ""] + Pin[300.00mil -300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "" "3" ""] + Pin[0.0000 -300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "" "4" ""] + ElementLine [-110.00mil 110.00mil -110.00mil -350.00mil 10.00mil] + ElementLine [-60.00mil -400.00mil 350.00mil -400.00mil 10.00mil] + ElementLine [400.00mil -350.00mil 400.00mil 60.00mil 10.00mil] + ElementLine [350.00mil 110.00mil -110.00mil 110.00mil 10.00mil] + ElementArc [-60.00mil -350.00mil 50.00mil 50.00mil 270 90 10.00mil] + ElementArc [350.00mil -350.00mil 50.00mil 50.00mil 180 90 10.00mil] + ElementArc [350.00mil 60.00mil 50.00mil 50.00mil 90 90 10.00mil] + + ) + +Element["" "RS422 Transciever" "U6" "LTC490" 1005.00mil 895.00mil -505.00mil -55.00mil 0 150 ""] +( + Pin[0.0000 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "Vcc" "100000000000000>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" "square"] + Pin[0.0000 -100.00mil 60.00mil 30.00mil 90.00mil 28.00mil "R" "2" ""] + Pin[0.0000 -200.00mil 60.00mil 30.00mil 90.00mil 28.00mil "D" "3" ""] + Pin[0.0000 -300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "GND" "4" ""] + Pin[-300.00mil -300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "Y" "5" ""] + Pin[-300.00mil -200.00mil 60.00mil 30.00mil 90.00mil 28.00mil "Z" "6" ""] + Pin[-300.00mil -100.00mil 60.00mil 30.00mil 90.00mil 28.00mil "B" "7" ""] + Pin[-300.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "A" "8" ""] + ElementLine [50.00mil 50.00mil 50.00mil -350.00mil 10.00mil] + ElementLine [50.00mil -350.00mil -350.00mil -350.00mil 10.00mil] + ElementLine [-350.00mil -350.00mil -350.00mil 50.00mil 10.00mil] + ElementLine [50.00mil 50.00mil -100.00mil 50.00mil 10.00mil] + ElementLine [-200.00mil 50.00mil -350.00mil 50.00mil 10.00mil] + ElementArc [-150.00mil 50.00mil 50.00mil 50.00mil 180 180 10.00mil] + + ) + +Element["" "PIC16C54A" "U5" "PIC16C54" 1195.00mil 860.00mil 465.00mil 80.00mil 0 150 ""] +( + Pin[0.0000 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "RA2" "1" "square,edge2"] + Pin[100.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "RA3" "2" "edge2"] + Pin[200.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "RTCC" "3" "edge2"] + Pin[300.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "/MCLR" "4" "edge2"] + Pin[400.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "Vss" "5" "edge2"] + Pin[500.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "RB0" "6" "edge2"] + Pin[600.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "RB1" "7" "edge2"] + Pin[700.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "RB2" "8" "edge2"] + Pin[800.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "RB3" "9" "edge2"] + Pin[800.00mil -300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "RB4" "10" "edge2"] + Pin[700.00mil -300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "RB5" "11" "edge2"] + Pin[600.00mil -300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "RB6" "12" "edge2"] + Pin[500.00mil -300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "RB7" "13" "edge2"] + Pin[400.00mil -300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "Vdd" "14" "edge2"] + Pin[300.00mil -300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "OSC2/CLKOUT" "15" "edge2"] + Pin[200.00mil -300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "OSC1/CLKIN" "16" "edge2"] + Pin[100.00mil -300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "RA0" "17" "edge2"] + Pin[0.0000 -300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "RA1" "18" "edge2"] + ElementLine [-50.00mil 50.00mil 850.00mil 50.00mil 10.00mil] + ElementLine [850.00mil 50.00mil 850.00mil -350.00mil 10.00mil] + ElementLine [850.00mil -350.00mil -50.00mil -350.00mil 10.00mil] + ElementLine [-50.00mil 50.00mil -50.00mil -100.00mil 10.00mil] + ElementLine [-50.00mil -200.00mil -50.00mil -350.00mil 10.00mil] + ElementArc [-50.00mil -150.00mil 50.00mil 50.00mil 90 180 10.00mil] + + ) + +Element["" "SMD Cap" "C17" "" 2155.00mil 815.00mil -90.00mil -329.00mil 0 150 ""] +( + Pin[0.0000 0.0000 80.00mil 30.00mil 110.00mil 35.00mil "1" "1" ""] + Pin[0.0000 -200.00mil 80.00mil 30.00mil 110.00mil 35.00mil "2" "2" ""] + ElementLine [-50.00mil 50.00mil 50.00mil 50.00mil 10.00mil] + ElementLine [50.00mil 50.00mil 50.00mil -250.00mil 10.00mil] + ElementLine [50.00mil -250.00mil -50.00mil -250.00mil 10.00mil] + ElementLine [-50.00mil -250.00mil -50.00mil 50.00mil 10.00mil] + + ) + +Element["" "SMD 0805" "C13" "" 2525.00mil 1510.00mil -30.00mil 45.00mil 0 150 ""] +( + Pad[0.0000 0.0000 0.0000 0.0000 60.00mil 30.00mil 90.00mil "1" "1" "square"] + Pad[0.0000 -90.00mil 0.0000 -90.00mil 60.00mil 30.00mil 90.00mil "2" "2" "square"] + ElementLine [-35.00mil -125.00mil -35.00mil 35.00mil 10.00mil] + ElementLine [35.00mil -125.00mil -35.00mil -125.00mil 10.00mil] + ElementLine [35.00mil 35.00mil 35.00mil -125.00mil 10.00mil] + ElementLine [-35.00mil 35.00mil 35.00mil 35.00mil 10.00mil] + + ) + +Element["hidename" "SMD 0805" "C16" "" 1080.00mil 1355.00mil -15.00mil -115.00mil 0 150 ""] +( + Pad[0.0000 0.0000 0.0000 0.0000 60.00mil 30.00mil 90.00mil "1" "1" "square"] + Pad[90.00mil 0.0000 90.00mil 0.0000 60.00mil 30.00mil 90.00mil "2" "2" "square,edge2"] + ElementLine [125.00mil -35.00mil -35.00mil -35.00mil 10.00mil] + ElementLine [125.00mil 35.00mil 125.00mil -35.00mil 10.00mil] + ElementLine [-35.00mil 35.00mil 125.00mil 35.00mil 10.00mil] + ElementLine [-35.00mil -35.00mil -35.00mil 35.00mil 10.00mil] + + ) + +Element["" "SMD 0805" "C14" "" 1175.00mil 1690.00mil -195.00mil 20.00mil 0 150 ""] +( + Pad[0.0000 0.0000 0.0000 0.0000 60.00mil 30.00mil 90.00mil "1" "1" "square"] + Pad[0.0000 90.00mil 0.0000 90.00mil 60.00mil 30.00mil 90.00mil "2" "2" "square"] + ElementLine [35.00mil 125.00mil 35.00mil -35.00mil 10.00mil] + ElementLine [-35.00mil 125.00mil 35.00mil 125.00mil 10.00mil] + ElementLine [-35.00mil -35.00mil -35.00mil 125.00mil 10.00mil] + ElementLine [35.00mil -35.00mil -35.00mil -35.00mil 10.00mil] + + ) + +Element["" "SMD Cap" "C15" "" 1280.00mil 1785.00mil 65.00mil -174.00mil 0 150 ""] +( + Pin[0.0000 0.0000 80.00mil 30.00mil 110.00mil 35.00mil "1" "1" ""] + Pin[0.0000 -200.00mil 80.00mil 30.00mil 110.00mil 35.00mil "2" "2" ""] + ElementLine [-50.00mil 50.00mil 50.00mil 50.00mil 10.00mil] + ElementLine [50.00mil 50.00mil 50.00mil -250.00mil 10.00mil] + ElementLine [50.00mil -250.00mil -50.00mil -250.00mil 10.00mil] + ElementLine [-50.00mil -250.00mil -50.00mil 50.00mil 10.00mil] + + ) + +Element["hidename" "SMD 0805" "C10" "" 2095.00mil 1310.00mil -190.00mil -60.00mil 0 150 ""] +( + Pad[0.0000 0.0000 0.0000 0.0000 60.00mil 30.00mil 90.00mil "1" "1" "square"] + Pad[90.00mil 0.0000 90.00mil 0.0000 60.00mil 30.00mil 90.00mil "2" "2" "square,edge2"] + ElementLine [125.00mil -35.00mil -35.00mil -35.00mil 10.00mil] + ElementLine [125.00mil 35.00mil 125.00mil -35.00mil 10.00mil] + ElementLine [-35.00mil 35.00mil 125.00mil 35.00mil 10.00mil] + ElementLine [-35.00mil -35.00mil -35.00mil 35.00mil 10.00mil] + + ) + +Element["" "SMD Cap" "C12" "" 2345.00mil 1320.00mil -35.00mil -129.00mil 0 150 ""] +( + Pin[0.0000 0.0000 80.00mil 30.00mil 110.00mil 35.00mil "1" "1" "edge2"] + Pin[200.00mil 0.0000 80.00mil 30.00mil 110.00mil 35.00mil "2" "2" "edge2,thermal(1)"] + ElementLine [-50.00mil -50.00mil -50.00mil 50.00mil 10.00mil] + ElementLine [-50.00mil 50.00mil 250.00mil 50.00mil 10.00mil] + ElementLine [250.00mil 50.00mil 250.00mil -50.00mil 10.00mil] + ElementLine [250.00mil -50.00mil -50.00mil -50.00mil 10.00mil] + + ) + +Element["" "R 0.25W" "R13" "100" 1130.00mil 1435.00mil 230.00mil 65.00mil 0 150 ""] +( + Pin[0.0000 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "1" "1" "square,edge2"] + Pin[400.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "2" "2" "edge2"] + ElementLine [100.00mil -50.00mil 300.00mil -50.00mil 10.00mil] + ElementLine [300.00mil -50.00mil 300.00mil 50.00mil 10.00mil] + ElementLine [300.00mil 50.00mil 100.00mil 50.00mil 10.00mil] + ElementLine [100.00mil 50.00mil 100.00mil -50.00mil 10.00mil] + ElementLine [40.00mil 0.0000 100.00mil 0.0000 10.00mil] + ElementLine [300.00mil 0.0000 360.00mil 0.0000 10.00mil] + + ) + +Element["" "R 0.25W" "R14" "100" 1105.00mil 1075.00mil -265.00mil 60.00mil 0 150 ""] +( + Pin[0.0000 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "1" "1" "edge2"] + Pin[-400.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "2" "2" "edge2"] + ElementLine [-100.00mil 50.00mil -300.00mil 50.00mil 10.00mil] + ElementLine [-300.00mil 50.00mil -300.00mil -50.00mil 10.00mil] + ElementLine [-300.00mil -50.00mil -100.00mil -50.00mil 10.00mil] + ElementLine [-100.00mil -50.00mil -100.00mil 50.00mil 10.00mil] + ElementLine [-40.00mil 0.0000 -100.00mil 0.0000 10.00mil] + ElementLine [-300.00mil 0.0000 -360.00mil 0.0000 10.00mil] + + ) + +Element["" "R 0.5W" "R11" "" 2815.00mil 1700.00mil 60.00mil -90.00mil 0 150 ""] +( + Pin[0.0000 0.0000 85.00mil 30.00mil 115.00mil 48.00mil "1" "1" "square"] + Pin[0.0000 -800.00mil 85.00mil 30.00mil 115.00mil 48.00mil "2" "2" ""] + ElementLine [0.0000 -60.00mil 0.0000 -115.00mil 10.00mil] + ElementLine [-115.00mil -115.00mil 115.00mil -115.00mil 10.00mil] + ElementLine [115.00mil -115.00mil 115.00mil -685.00mil 10.00mil] + ElementLine [115.00mil -685.00mil -115.00mil -685.00mil 10.00mil] + ElementLine [-115.00mil -685.00mil -115.00mil -115.00mil 10.00mil] + ElementLine [0.0000 -685.00mil 0.0000 -750.00mil 10.00mil] + + ) + +Element["" "TK11950" "U3" "5.0V" 2235.00mil 1510.00mil -139.00mil -2.00mil 0 150 ""] +( + Pad[-7.00mil 0.0000 8.00mil 0.0000 24.00mil 30.00mil 54.00mil "NOISE BYPASS" "1" "square"] + Pad[-7.00mil 37.00mil 8.00mil 37.00mil 24.00mil 30.00mil 54.00mil "CONTROL" "2" "square"] + Pad[-7.00mil 75.00mil 8.00mil 75.00mil 24.00mil 30.00mil 54.00mil "RESET OUT" "3" "square"] + Pad[119.00mil 75.00mil 134.00mil 75.00mil 24.00mil 30.00mil 54.00mil "VO" "4" "square,edge2"] + Pad[119.00mil 37.00mil 134.00mil 37.00mil 24.00mil 30.00mil 54.00mil "GND" "5" "square,edge2"] + Pad[119.00mil 0.0000 134.00mil 0.0000 24.00mil 30.00mil 54.00mil "VIN" "6" "square,edge2"] + ElementLine [0.0000 -22.00mil 0.0000 -34.00mil 10.00mil] + ElementLine [0.0000 -34.00mil 132.00mil -34.00mil 10.00mil] + ElementLine [132.00mil -34.00mil 132.00mil -22.00mil 10.00mil] + ElementLine [0.0000 96.00mil 0.0000 108.00mil 10.00mil] + ElementLine [0.0000 108.00mil 132.00mil 108.00mil 10.00mil] + ElementLine [132.00mil 108.00mil 132.00mil 96.00mil 10.00mil] + ElementLine [13.00mil -24.00mil 119.00mil -24.00mil 10.00mil] + + ) + +Element["" "TK11950" "U4" "5.0V" 1180.00mil 1590.00mil -254.00mil -132.00mil 0 150 ""] +( + Pad[-8.00mil 0.0000 7.00mil 0.0000 24.00mil 30.00mil 54.00mil "NOISE BYPASS" "1" "square,edge2"] + Pad[-8.00mil -37.00mil 7.00mil -37.00mil 24.00mil 30.00mil 54.00mil "CONTROL" "2" "square,edge2"] + Pad[-8.00mil -75.00mil 7.00mil -75.00mil 24.00mil 30.00mil 54.00mil "RESET OUT" "3" "square,edge2"] + Pad[-134.00mil -75.00mil -119.00mil -75.00mil 24.00mil 30.00mil 54.00mil "VO" "4" "square"] + Pad[-134.00mil -37.00mil -119.00mil -37.00mil 24.00mil 30.00mil 54.00mil "GND" "5" "square"] + Pad[-134.00mil 0.0000 -119.00mil 0.0000 24.00mil 30.00mil 54.00mil "VIN" "6" "square"] + ElementLine [0.0000 22.00mil 0.0000 34.00mil 10.00mil] + ElementLine [0.0000 34.00mil -132.00mil 34.00mil 10.00mil] + ElementLine [-132.00mil 34.00mil -132.00mil 22.00mil 10.00mil] + ElementLine [0.0000 -96.00mil 0.0000 -108.00mil 10.00mil] + ElementLine [0.0000 -108.00mil -132.00mil -108.00mil 10.00mil] + ElementLine [-132.00mil -108.00mil -132.00mil -96.00mil 10.00mil] + ElementLine [-13.00mil 24.00mil -119.00mil 24.00mil 10.00mil] + + ) + +Element["" "SMD 0805" "C5" "" 1495.00mil 1315.00mil -225.00mil -30.00mil 0 150 ""] +( + Pad[0.0000 0.0000 0.0000 0.0000 60.00mil 30.00mil 90.00mil "1" "1" "square,edge2"] + Pad[-90.00mil 0.0000 -90.00mil 0.0000 60.00mil 30.00mil 90.00mil "2" "2" "square"] + ElementLine [-125.00mil 35.00mil 35.00mil 35.00mil 10.00mil] + ElementLine [-125.00mil -35.00mil -125.00mil 35.00mil 10.00mil] + ElementLine [35.00mil -35.00mil -125.00mil -35.00mil 10.00mil] + ElementLine [35.00mil 35.00mil 35.00mil -35.00mil 10.00mil] + + ) + +Element["hidename" "SMD 0805" "C11" "" 2270.00mil 1420.00mil -260.00mil -30.00mil 0 150 ""] +( + Pad[0.0000 0.0000 0.0000 0.0000 60.00mil 30.00mil 90.00mil "1" "1" "square,edge2"] + Pad[-90.00mil 0.0000 -90.00mil 0.0000 60.00mil 30.00mil 90.00mil "2" "2" "square"] + ElementLine [-125.00mil 35.00mil 35.00mil 35.00mil 10.00mil] + ElementLine [-125.00mil -35.00mil -125.00mil 35.00mil 10.00mil] + ElementLine [35.00mil -35.00mil -125.00mil -35.00mil 10.00mil] + ElementLine [35.00mil 35.00mil 35.00mil -35.00mil 10.00mil] + + ) + +Element["" "SMD Cap" "C9" "" 2030.00mil 1185.00mil -145.00mil -40.00mil 0 150 ""] +( + Pin[0.0000 0.0000 80.00mil 30.00mil 110.00mil 35.00mil "1" "1" "edge2,thermal(5)"] + Pin[200.00mil 0.0000 80.00mil 30.00mil 110.00mil 35.00mil "2" "2" "edge2,thermal(1)"] + ElementLine [0.0000 45.00mil 0.0000 50.00mil 10.00mil] + ElementLine [0.0000 50.00mil 200.00mil 50.00mil 10.00mil] + ElementLine [200.00mil 50.00mil 200.00mil 45.00mil 10.00mil] + ElementLine [200.00mil -45.00mil 200.00mil -50.00mil 10.00mil] + ElementLine [200.00mil -50.00mil 0.0000 -50.00mil 10.00mil] + ElementLine [0.0000 -50.00mil 0.0000 -45.00mil 10.00mil] + + ) + +Element["" "R 0.25W" "R7" "100" 1655.00mil 2065.00mil 150.00mil -30.00mil 0 150 ""] +( + Pin[0.0000 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "1" "1" "edge2"] + Pin[400.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "2" "2" "edge2,thermal(1)"] + ElementLine [100.00mil -50.00mil 300.00mil -50.00mil 10.00mil] + ElementLine [300.00mil -50.00mil 300.00mil 50.00mil 10.00mil] + ElementLine [300.00mil 50.00mil 100.00mil 50.00mil 10.00mil] + ElementLine [100.00mil 50.00mil 100.00mil -50.00mil 10.00mil] + ElementLine [40.00mil 0.0000 100.00mil 0.0000 10.00mil] + ElementLine [300.00mil 0.0000 360.00mil 0.0000 10.00mil] + + ) + +Element["" "SMD Cap" "C8" "" 2030.00mil 1075.00mil 65.00mil -124.00mil 0 150 ""] +( + Pin[0.0000 0.0000 80.00mil 30.00mil 110.00mil 35.00mil "1" "1" "edge2,thermal(5)"] + Pin[200.00mil 0.0000 80.00mil 30.00mil 110.00mil 35.00mil "2" "2" "edge2,thermal(1)"] + ElementLine [-50.00mil -50.00mil -50.00mil 50.00mil 10.00mil] + ElementLine [-50.00mil 50.00mil 250.00mil 50.00mil 10.00mil] + ElementLine [250.00mil 50.00mil 250.00mil -50.00mil 10.00mil] + ElementLine [250.00mil -50.00mil -50.00mil -50.00mil 10.00mil] + + ) + +Element["" "SMD Cap" "C7" "" 1530.00mil 1075.00mil -370.00mil -144.00mil 0 150 ""] +( + Pin[0.0000 0.0000 80.00mil 30.00mil 110.00mil 35.00mil "1" "1" "edge2,thermal(5)"] + Pin[-200.00mil 0.0000 80.00mil 30.00mil 110.00mil 35.00mil "2" "2" "edge2,thermal(4)"] + ElementLine [50.00mil 50.00mil 50.00mil -50.00mil 10.00mil] + ElementLine [50.00mil -50.00mil -250.00mil -50.00mil 10.00mil] + ElementLine [-250.00mil -50.00mil -250.00mil 50.00mil 10.00mil] + ElementLine [-250.00mil 50.00mil 50.00mil 50.00mil 10.00mil] + + ) + +Element["" "SMD Cap" "C2" "" 1945.00mil 1845.00mil 65.00mil -19.00mil 0 150 ""] +( + Pin[0.0000 0.0000 80.00mil 30.00mil 110.00mil 35.00mil "1" "1" "square,edge2"] + Pin[-200.00mil 0.0000 80.00mil 30.00mil 110.00mil 35.00mil "2" "2" "edge2"] + ElementLine [50.00mil 50.00mil 50.00mil -50.00mil 10.00mil] + ElementLine [50.00mil -50.00mil -250.00mil -50.00mil 10.00mil] + ElementLine [-250.00mil -50.00mil -250.00mil 50.00mil 10.00mil] + ElementLine [-250.00mil 50.00mil 50.00mil 50.00mil 10.00mil] + + ) + +Element["" "SMD Cap" "C6" "" 1530.00mil 1185.00mil -335.00mil -30.00mil 0 150 ""] +( + Pin[0.0000 0.0000 80.00mil 30.00mil 110.00mil 35.00mil "1" "1" "edge2,thermal(5)"] + Pin[-200.00mil 0.0000 80.00mil 30.00mil 110.00mil 35.00mil "2" "2" "edge2,thermal(4)"] + ElementLine [0.0000 -45.00mil 0.0000 -50.00mil 10.00mil] + ElementLine [0.0000 -50.00mil -200.00mil -50.00mil 10.00mil] + ElementLine [-200.00mil -50.00mil -200.00mil -45.00mil 10.00mil] + ElementLine [-200.00mil 45.00mil -200.00mil 50.00mil 10.00mil] + ElementLine [-200.00mil 50.00mil 0.0000 50.00mil 10.00mil] + ElementLine [0.0000 50.00mil 0.0000 45.00mil 10.00mil] + + ) + +Element["" "SMD Cap" "C1" "" 1490.00mil 1950.00mil -40.00mil 71.00mil 0 150 ""] +( + Pin[0.0000 0.0000 80.00mil 30.00mil 110.00mil 35.00mil "1" "1" "square"] + Pin[0.0000 -200.00mil 80.00mil 30.00mil 110.00mil 35.00mil "2" "2" ""] + ElementLine [-50.00mil 50.00mil 50.00mil 50.00mil 10.00mil] + ElementLine [50.00mil 50.00mil 50.00mil -250.00mil 10.00mil] + ElementLine [50.00mil -250.00mil -50.00mil -250.00mil 10.00mil] + ElementLine [-50.00mil -250.00mil -50.00mil 50.00mil 10.00mil] + + ) + +Element["" "R 0.25W" "R6" "100" 2375.00mil 1680.00mil 65.00mil 115.00mil 0 150 ""] +( + Pin[0.0000 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "1" "1" "square"] + Pin[0.0000 400.00mil 60.00mil 30.00mil 90.00mil 28.00mil "2" "2" ""] + ElementLine [50.00mil 100.00mil 50.00mil 300.00mil 10.00mil] + ElementLine [50.00mil 300.00mil -50.00mil 300.00mil 10.00mil] + ElementLine [-50.00mil 300.00mil -50.00mil 100.00mil 10.00mil] + ElementLine [-50.00mil 100.00mil 50.00mil 100.00mil 10.00mil] + ElementLine [0.0000 40.00mil 0.0000 100.00mil 10.00mil] + ElementLine [0.0000 300.00mil 0.0000 360.00mil 10.00mil] + + ) + +Element["" "R 0.25W" "R8" "100" 2270.00mil 1680.00mil -30.00mil 245.00mil 1 150 ""] +( + Pin[0.0000 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "1" "1" "square"] + Pin[0.0000 400.00mil 60.00mil 30.00mil 90.00mil 28.00mil "2" "2" ""] + ElementLine [50.00mil 100.00mil 50.00mil 300.00mil 10.00mil] + ElementLine [50.00mil 300.00mil -50.00mil 300.00mil 10.00mil] + ElementLine [-50.00mil 300.00mil -50.00mil 100.00mil 10.00mil] + ElementLine [-50.00mil 100.00mil 50.00mil 100.00mil 10.00mil] + ElementLine [0.0000 40.00mil 0.0000 100.00mil 10.00mil] + ElementLine [0.0000 300.00mil 0.0000 360.00mil 10.00mil] + + ) + +Element["" "R 0.25W" "R5" "100" 1375.00mil 1750.00mil -170.00mil 175.00mil 0 150 ""] +( + Pin[0.0000 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "1" "1" "square"] + Pin[0.0000 400.00mil 60.00mil 30.00mil 90.00mil 28.00mil "2" "2" ""] + ElementLine [50.00mil 100.00mil 50.00mil 300.00mil 10.00mil] + ElementLine [50.00mil 300.00mil -50.00mil 300.00mil 10.00mil] + ElementLine [-50.00mil 300.00mil -50.00mil 100.00mil 10.00mil] + ElementLine [-50.00mil 100.00mil 50.00mil 100.00mil 10.00mil] + ElementLine [0.0000 40.00mil 0.0000 100.00mil 10.00mil] + ElementLine [0.0000 300.00mil 0.0000 360.00mil 10.00mil] + + ) + +Element["" "R 0.25W" "R9" "100" 1655.00mil 2170.00mil 125.00mil -25.00mil 0 150 ""] +( + Pin[0.0000 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "1" "1" "edge2"] + Pin[400.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "2" "2" "edge2,thermal(1)"] + ElementLine [100.00mil -50.00mil 300.00mil -50.00mil 10.00mil] + ElementLine [300.00mil -50.00mil 300.00mil 50.00mil 10.00mil] + ElementLine [300.00mil 50.00mil 100.00mil 50.00mil 10.00mil] + ElementLine [100.00mil 50.00mil 100.00mil -50.00mil 10.00mil] + ElementLine [40.00mil 0.0000 100.00mil 0.0000 10.00mil] + ElementLine [300.00mil 0.0000 360.00mil 0.0000 10.00mil] + + ) + +Element["" "R 0.25W" "R10" "100" 2160.00mil 1675.00mil -30.00mil 275.00mil 1 150 ""] +( + Pin[0.0000 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "1" "1" "square"] + Pin[0.0000 400.00mil 60.00mil 30.00mil 90.00mil 28.00mil "2" "2" "thermal(1)"] + ElementLine [50.00mil 100.00mil 50.00mil 300.00mil 10.00mil] + ElementLine [50.00mil 300.00mil -50.00mil 300.00mil 10.00mil] + ElementLine [-50.00mil 300.00mil -50.00mil 100.00mil 10.00mil] + ElementLine [-50.00mil 100.00mil 50.00mil 100.00mil 10.00mil] + ElementLine [0.0000 40.00mil 0.0000 100.00mil 10.00mil] + ElementLine [0.0000 300.00mil 0.0000 360.00mil 10.00mil] + + ) + +Element["" "ADC12138CIMSA" "U2" "ADC12138" 1630.00mil 1690.00mil 105.00mil -449.00mil 0 150 ""] +( + Pad[0.0000 -30.00mil 0.0000 30.00mil 12.00mil 30.00mil 42.00mil "CH0" "1" "square,edge2"] + Pad[26.00mil -30.00mil 26.00mil 30.00mil 12.00mil 30.00mil 42.00mil "CH1" "2" "square,edge2"] + Pad[51.00mil -30.00mil 51.00mil 30.00mil 12.00mil 30.00mil 42.00mil "CH2" "3" "square,edge2"] + Pad[77.00mil -30.00mil 77.00mil 30.00mil 12.00mil 30.00mil 42.00mil "CH3" "4" "square,edge2"] + Pad[102.00mil -30.00mil 102.00mil 30.00mil 12.00mil 30.00mil 42.00mil "CH4" "5" "square,edge2"] + Pad[128.00mil -30.00mil 128.00mil 30.00mil 12.00mil 30.00mil 42.00mil "CH5" "6" "square,edge2"] + Pad[154.00mil -30.00mil 154.00mil 30.00mil 12.00mil 30.00mil 42.00mil "CH6" "7" "square,edge2"] + Pad[179.00mil -30.00mil 179.00mil 30.00mil 12.00mil 30.00mil 42.00mil "CH7" "8" "square,edge2"] + Pad[205.00mil -30.00mil 205.00mil 30.00mil 12.00mil 30.00mil 42.00mil "COM" "9" "square,edge2"] + Pad[230.00mil -30.00mil 230.00mil 30.00mil 12.00mil 30.00mil 42.00mil "MuOut1" "10" "square,edge2"] + Pad[256.00mil -30.00mil 256.00mil 30.00mil 12.00mil 30.00mil 42.00mil "A/Din1" "11" "square,edge2"] + Pad[281.00mil -30.00mil 281.00mil 30.00mil 12.00mil 30.00mil 42.00mil "MuxOut2" "12" "square,edge2"] + Pad[307.00mil -30.00mil 307.00mil 30.00mil 12.00mil 30.00mil 42.00mil "A/Din2" "13" "square,edge2"] + Pad[333.00mil -30.00mil 333.00mil 30.00mil 12.00mil 30.00mil 42.00mil "DGND" "14" "square,edge2"] + Pad[333.00mil -350.00mil 333.00mil -290.00mil 12.00mil 30.00mil 42.00mil "VA+" "15" "square"] + Pad[307.00mil -350.00mil 307.00mil -290.00mil 12.00mil 30.00mil 42.00mil "Vref-" "16" "square"] + Pad[281.00mil -350.00mil 281.00mil -290.00mil 12.00mil 30.00mil 42.00mil "Vref+" "17" "square"] + Pad[256.00mil -350.00mil 256.00mil -290.00mil 12.00mil 30.00mil 42.00mil "AGND" "18" "square"] + Pad[230.00mil -350.00mil 230.00mil -290.00mil 12.00mil 30.00mil 42.00mil "PD" "19" "square"] + Pad[205.00mil -350.00mil 205.00mil -290.00mil 12.00mil 30.00mil 42.00mil "EOC" "20" "square"] + Pad[179.00mil -350.00mil 179.00mil -290.00mil 12.00mil 30.00mil 42.00mil "~CONV" "21" "square"] + Pad[154.00mil -350.00mil 154.00mil -290.00mil 12.00mil 30.00mil 42.00mil "~CS" "22" "square"] + Pad[128.00mil -350.00mil 128.00mil -290.00mil 12.00mil 30.00mil 42.00mil "DO" "23" "square"] + Pad[102.00mil -350.00mil 102.00mil -290.00mil 12.00mil 30.00mil 42.00mil "DI" "24" "square"] + Pad[77.00mil -350.00mil 77.00mil -290.00mil 12.00mil 30.00mil 42.00mil "SCLK" "25" "square"] + Pad[51.00mil -350.00mil 51.00mil -290.00mil 12.00mil 30.00mil 42.00mil "CCLK" "26" "square"] + Pad[26.00mil -350.00mil 26.00mil -290.00mil 12.00mil 30.00mil 42.00mil "~DOR" "27" "square"] + Pad[0.0000 -350.00mil 0.0000 -290.00mil 12.00mil 30.00mil 42.00mil "VD+" "28" "square"] + ElementLine [0.0000 -70.00mil 0.0000 -70.00mil 30.00mil] + ElementLine [-12.00mil -54.00mil -37.00mil -54.00mil 10.00mil] + ElementLine [-37.00mil -54.00mil -37.00mil -266.00mil 10.00mil] + ElementLine [-37.00mil -266.00mil -12.00mil -266.00mil 10.00mil] + ElementLine [343.00mil -54.00mil 370.00mil -54.00mil 10.00mil] + ElementLine [370.00mil -54.00mil 370.00mil -266.00mil 10.00mil] + ElementLine [370.00mil -266.00mil 343.00mil -266.00mil 10.00mil] + + ) + +Element["" "R 0.25W" "R4" "100" 1615.00mil 1955.00mil 130.00mil -35.00mil 0 150 ""] +( + Pin[0.0000 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "1" "1" "square,edge2"] + Pin[400.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "2" "2" "edge2"] + ElementLine [100.00mil -50.00mil 300.00mil -50.00mil 10.00mil] + ElementLine [300.00mil -50.00mil 300.00mil 50.00mil 10.00mil] + ElementLine [300.00mil 50.00mil 100.00mil 50.00mil 10.00mil] + ElementLine [100.00mil 50.00mil 100.00mil -50.00mil 10.00mil] + ElementLine [40.00mil 0.0000 100.00mil 0.0000 10.00mil] + ElementLine [300.00mil 0.0000 360.00mil 0.0000 10.00mil] + + ) + +Element["hidename" "SMD 0805" "C4" "" 2070.00mil 2390.00mil -25.00mil -180.00mil 0 115 ""] +( + Pad[0.0000 0.0000 0.0000 0.0000 60.00mil 30.00mil 90.00mil "1" "1" "square"] + Pad[0.0000 -90.00mil 0.0000 -90.00mil 60.00mil 30.00mil 90.00mil "2" "2" "square"] + ElementLine [-35.00mil -125.00mil -35.00mil 35.00mil 10.00mil] + ElementLine [35.00mil -125.00mil -35.00mil -125.00mil 10.00mil] + ElementLine [35.00mil 35.00mil 35.00mil -125.00mil 10.00mil] + ElementLine [-35.00mil 35.00mil 35.00mil 35.00mil 10.00mil] + + ) + +Element["" "R 0.25W" "R1" "100" 2180.00mil 2625.00mil -35.00mil -145.00mil 1 150 ""] +( + Pin[0.0000 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "1" "1" "square"] + Pin[0.0000 -400.00mil 60.00mil 30.00mil 90.00mil 28.00mil "2" "2" ""] + ElementLine [-50.00mil -100.00mil -50.00mil -300.00mil 10.00mil] + ElementLine [-50.00mil -300.00mil 50.00mil -300.00mil 10.00mil] + ElementLine [50.00mil -300.00mil 50.00mil -100.00mil 10.00mil] + ElementLine [50.00mil -100.00mil -50.00mil -100.00mil 10.00mil] + ElementLine [0.0000 -40.00mil 0.0000 -100.00mil 10.00mil] + ElementLine [0.0000 -300.00mil 0.0000 -360.00mil 10.00mil] + + ) + +Element["" "R 0.25W" "R2" "100" 2400.00mil 2625.00mil 60.00mil -100.00mil 0 150 ""] +( + Pin[0.0000 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "1" "1" "square"] + Pin[0.0000 -400.00mil 60.00mil 30.00mil 90.00mil 28.00mil "2" "2" ""] + ElementLine [-50.00mil -100.00mil -50.00mil -300.00mil 10.00mil] + ElementLine [-50.00mil -300.00mil 50.00mil -300.00mil 10.00mil] + ElementLine [50.00mil -300.00mil 50.00mil -100.00mil 10.00mil] + ElementLine [50.00mil -100.00mil -50.00mil -100.00mil 10.00mil] + ElementLine [0.0000 -40.00mil 0.0000 -100.00mil 10.00mil] + ElementLine [0.0000 -300.00mil 0.0000 -360.00mil 10.00mil] + + ) + +Element["" "LM13700" "U1" "LM13700" 1955.00mil 2285.00mil -475.00mil -130.00mil 0 150 ""] +( + Pin[0.0000 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "Iabc1" "1" "square,edge2"] + Pin[-100.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "Dbias1" "2" "edge2"] + Pin[-200.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "In+1" "3" "edge2"] + Pin[-300.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "In-1" "4" "edge2"] + Pin[-400.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "Out1" "5" "edge2"] + Pin[-500.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "V-" "6" "edge2"] + Pin[-600.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "BufIn1" "7" "edge2"] + Pin[-700.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "BufOut1" "8" "edge2"] + Pin[-700.00mil 300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "BufOut2" "9" "edge2"] + Pin[-600.00mil 300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "BufIn2" "10" "edge2"] + Pin[-500.00mil 300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "V+" "11" "edge2"] + Pin[-400.00mil 300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "Out2" "12" "edge2"] + Pin[-300.00mil 300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "In-2" "13" "edge2"] + Pin[-200.00mil 300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "In+2" "14" "edge2"] + Pin[-100.00mil 300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "Dbias2" "15" "edge2"] + Pin[0.0000 300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "Iabc2" "16" "edge2"] + ElementLine [50.00mil -50.00mil -750.00mil -50.00mil 10.00mil] + ElementLine [-750.00mil -50.00mil -750.00mil 350.00mil 10.00mil] + ElementLine [-750.00mil 350.00mil 50.00mil 350.00mil 10.00mil] + ElementLine [50.00mil -50.00mil 50.00mil 100.00mil 10.00mil] + ElementLine [50.00mil 200.00mil 50.00mil 350.00mil 10.00mil] + ElementArc [50.00mil 150.00mil 50.00mil 50.00mil 270 180 10.00mil] + + ) + +Element["" "R 0.25W" "R3" "100" 2290.00mil 2625.00mil -30.00mil -135.00mil 1 150 ""] +( + Pin[0.0000 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "1" "1" "square"] + Pin[0.0000 -400.00mil 60.00mil 30.00mil 90.00mil 28.00mil "2" "2" ""] + ElementLine [-50.00mil -100.00mil -50.00mil -300.00mil 10.00mil] + ElementLine [-50.00mil -300.00mil 50.00mil -300.00mil 10.00mil] + ElementLine [50.00mil -300.00mil 50.00mil -100.00mil 10.00mil] + ElementLine [50.00mil -100.00mil -50.00mil -100.00mil 10.00mil] + ElementLine [0.0000 -40.00mil 0.0000 -100.00mil 10.00mil] + ElementLine [0.0000 -300.00mil 0.0000 -360.00mil 10.00mil] + + ) + +Element["" "SMD 0805" "C3" "" 2075.00mil 2510.00mil -40.00mil 140.00mil 0 150 ""] +( + Pad[0.0000 0.0000 0.0000 0.0000 60.00mil 30.00mil 90.00mil "1" "1" "square"] + Pad[0.0000 90.00mil 0.0000 90.00mil 60.00mil 30.00mil 90.00mil "2" "2" "square"] + ElementLine [35.00mil 125.00mil 35.00mil -35.00mil 10.00mil] + ElementLine [-35.00mil 125.00mil 35.00mil 125.00mil 10.00mil] + ElementLine [-35.00mil -35.00mil -35.00mil 125.00mil 10.00mil] + ElementLine [35.00mil -35.00mil -35.00mil -35.00mil 10.00mil] + + ) + +Element["" "3 TERM BLOCK" "J2" "DK ED1602-ND" 1695.00mil 2925.00mil -590.00mil 76.00mil 0 150 ""] +( + Pin[0.0000 0.0000 110.00mil 30.00mil 140.00mil 48.00mil "1" "1" "edge2"] + Pin[-194.00mil 0.0000 110.00mil 30.00mil 140.00mil 48.00mil "2" "2" "edge2"] + Pin[-388.00mil 0.0000 110.00mil 30.00mil 140.00mil 48.00mil "3" "3" "edge2"] + ElementLine [-388.00mil 160.00mil -388.00mil 140.00mil 10.00mil] + ElementLine [-194.00mil 160.00mil -194.00mil 140.00mil 10.00mil] + ElementLine [0.0000 160.00mil 0.0000 140.00mil 10.00mil] + ElementLine [81.00mil -170.00mil 101.00mil -170.00mil 10.00mil] + ElementLine [81.00mil -190.00mil 81.00mil -170.00mil 10.00mil] + ElementLine [101.00mil -190.00mil 81.00mil -190.00mil 10.00mil] + ElementLine [-509.00mil -170.00mil -489.00mil -170.00mil 10.00mil] + ElementLine [-509.00mil -190.00mil -509.00mil -170.00mil 10.00mil] + ElementLine [-489.00mil -190.00mil -509.00mil -190.00mil 10.00mil] + ElementLine [101.00mil -200.00mil 101.00mil 160.00mil 10.00mil] + ElementLine [-489.00mil -200.00mil 101.00mil -200.00mil 10.00mil] + ElementLine [-489.00mil 160.00mil -489.00mil -200.00mil 10.00mil] + ElementLine [101.00mil 160.00mil -489.00mil 160.00mil 10.00mil] + + ) + +Element["" "SMD Cap" "C21" "" 2565.00mil 1070.00mil -50.00mil 61.00mil 0 150 ""] +( + Pin[0.0000 0.0000 80.00mil 30.00mil 110.00mil 35.00mil "1" "1" "edge2"] + Pin[-200.00mil 0.0000 80.00mil 30.00mil 110.00mil 35.00mil "2" "2" "edge2,thermal(1)"] + ElementLine [50.00mil 50.00mil 50.00mil -50.00mil 10.00mil] + ElementLine [50.00mil -50.00mil -250.00mil -50.00mil 10.00mil] + ElementLine [-250.00mil -50.00mil -250.00mil 50.00mil 10.00mil] + ElementLine [-250.00mil 50.00mil 50.00mil 50.00mil 10.00mil] + + ) + +Element["" "SMD 0805" "C20" "" 2665.00mil 2375.00mil -115.00mil 55.00mil 0 150 ""] +( + Pad[0.0000 0.0000 0.0000 0.0000 60.00mil 30.00mil 90.00mil "1" "1" "square,edge2"] + Pad[-90.00mil 0.0000 -90.00mil 0.0000 60.00mil 30.00mil 90.00mil "2" "2" "square"] + ElementLine [-125.00mil 35.00mil 35.00mil 35.00mil 10.00mil] + ElementLine [-125.00mil -35.00mil -125.00mil 35.00mil 10.00mil] + ElementLine [35.00mil -35.00mil -125.00mil -35.00mil 10.00mil] + ElementLine [35.00mil 35.00mil 35.00mil -35.00mil 10.00mil] + + ) + +Element["" "SMD 0805" "C19" "" 2785.00mil 2375.00mil -20.00mil 55.00mil 0 150 ""] +( + Pad[0.0000 0.0000 0.0000 0.0000 60.00mil 30.00mil 90.00mil "1" "1" "square"] + Pad[90.00mil 0.0000 90.00mil 0.0000 60.00mil 30.00mil 90.00mil "2" "2" "square,edge2"] + ElementLine [125.00mil -35.00mil -35.00mil -35.00mil 10.00mil] + ElementLine [125.00mil 35.00mil 125.00mil -35.00mil 10.00mil] + ElementLine [-35.00mil 35.00mil 125.00mil 35.00mil 10.00mil] + ElementLine [-35.00mil -35.00mil -35.00mil 35.00mil 10.00mil] + + ) + +Element["" "SMD 0805" "C18" "" 2665.00mil 1800.00mil 155.00mil -20.00mil 0 150 ""] +( + Pad[0.0000 0.0000 0.0000 0.0000 60.00mil 30.00mil 90.00mil "1" "1" "square"] + Pad[90.00mil 0.0000 90.00mil 0.0000 60.00mil 30.00mil 90.00mil "2" "2" "square,edge2"] + ElementLine [125.00mil -35.00mil -35.00mil -35.00mil 10.00mil] + ElementLine [125.00mil 35.00mil 125.00mil -35.00mil 10.00mil] + ElementLine [-35.00mil 35.00mil 125.00mil 35.00mil 10.00mil] + ElementLine [-35.00mil -35.00mil -35.00mil 35.00mil 10.00mil] + + ) + +Element["" "AMP 745781-4" "J3" "A2100-ND" 820.00mil 1610.00mil -125.00mil 837.00mil 0 150 ""] +( + Pin[0.0000 432.00mil 80.00mil 30.00mil 110.00mil 42.00mil "1" "1" "square"] + Pin[0.0000 324.00mil 80.00mil 30.00mil 110.00mil 42.00mil "2" "2" ""] + Pin[0.0000 216.00mil 80.00mil 30.00mil 110.00mil 42.00mil "3" "3" ""] + Pin[0.0000 108.00mil 80.00mil 30.00mil 110.00mil 42.00mil "4" "4" ""] + Pin[0.0000 0.0000 80.00mil 30.00mil 110.00mil 42.00mil "5" "5" ""] + Pin[-112.00mil 378.00mil 80.00mil 30.00mil 110.00mil 42.00mil "6" "6" ""] + Pin[-112.00mil 270.00mil 80.00mil 30.00mil 110.00mil 42.00mil "7" "7" ""] + Pin[-112.00mil 162.00mil 80.00mil 30.00mil 110.00mil 42.00mil "8" "8" ""] + Pin[-112.00mil 54.00mil 80.00mil 30.00mil 110.00mil 42.00mil "9" "9" ""] + Pin[-56.00mil -276.00mil 120.00mil 30.00mil 150.00mil 120.00mil "MOUNT HOLE" "10" "hole"] + Pin[-56.00mil 708.00mil 120.00mil 30.00mil 150.00mil 120.00mil "MOUNT HOLE" "11" "hole"] + ElementLine [-317.00mil -390.00mil 58.00mil -390.00mil 10.00mil] + ElementLine [-317.00mil -138.00mil -317.00mil -390.00mil 10.00mil] + ElementLine [-433.00mil 455.00mil -434.00mil -22.00mil 10.00mil] + ElementLine [-317.00mil 823.00mil -317.00mil 571.00mil 10.00mil] + ElementLine [58.00mil 823.00mil -317.00mil 823.00mil 10.00mil] + ElementLine [58.00mil -390.00mil 58.00mil 823.00mil 10.00mil] + ElementArc [-375.00mil -138.00mil 58.00mil 58.00mil 90 90 10.00mil] + ElementArc [-375.00mil -22.00mil 58.00mil 58.00mil 270 90 10.00mil] + ElementArc [-375.00mil 455.00mil 58.00mil 58.00mil 0 90 10.00mil] + ElementArc [-375.00mil 571.00mil 58.00mil 58.00mil 180 90 10.00mil] + + ) + +Element["" "3 TERM BLOCK" "J1" "DK ED1602-ND" 2285.00mil 2925.00mil 140.00mil 51.00mil 0 150 ""] +( + Pin[0.0000 0.0000 110.00mil 30.00mil 140.00mil 48.00mil "1" "1" "edge2"] + Pin[-194.00mil 0.0000 110.00mil 30.00mil 140.00mil 48.00mil "2" "2" "edge2"] + Pin[-388.00mil 0.0000 110.00mil 30.00mil 140.00mil 48.00mil "3" "3" "edge2"] + ElementLine [-388.00mil 160.00mil -388.00mil 140.00mil 10.00mil] + ElementLine [-194.00mil 160.00mil -194.00mil 140.00mil 10.00mil] + ElementLine [0.0000 160.00mil 0.0000 140.00mil 10.00mil] + ElementLine [81.00mil -170.00mil 101.00mil -170.00mil 10.00mil] + ElementLine [81.00mil -190.00mil 81.00mil -170.00mil 10.00mil] + ElementLine [101.00mil -190.00mil 81.00mil -190.00mil 10.00mil] + ElementLine [-509.00mil -170.00mil -489.00mil -170.00mil 10.00mil] + ElementLine [-509.00mil -190.00mil -509.00mil -170.00mil 10.00mil] + ElementLine [-489.00mil -190.00mil -509.00mil -190.00mil 10.00mil] + ElementLine [101.00mil -200.00mil 101.00mil 160.00mil 10.00mil] + ElementLine [-489.00mil -200.00mil 101.00mil -200.00mil 10.00mil] + ElementLine [-489.00mil 160.00mil -489.00mil -200.00mil 10.00mil] + ElementLine [101.00mil 160.00mil -489.00mil 160.00mil 10.00mil] + + ) + +Element["lock" "OP-AMP" "U7" "LTC1152" 2575.00mil 1925.00mil 380.00mil 200.00mil 0 150 ""] +( + Pin[0.0000 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "SHDN" "1" "square"] + Pin[0.0000 100.00mil 60.00mil 30.00mil 90.00mil 28.00mil "-IN" "2" ""] + Pin[0.0000 200.00mil 60.00mil 30.00mil 90.00mil 28.00mil "+IN" "3" ""] + Pin[0.0000 300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "V-" "4" "thermal(1)"] + Pin[300.00mil 300.00mil 60.00mil 30.00mil 90.00mil 28.00mil "COMP" "5" ""] + Pin[300.00mil 200.00mil 60.00mil 30.00mil 90.00mil 28.00mil "OUT" "6" ""] + Pin[300.00mil 100.00mil 60.00mil 30.00mil 90.00mil 28.00mil "V+" "7" ""] + Pin[300.00mil 0.0000 60.00mil 30.00mil 90.00mil 28.00mil "CP" "8" ""] + ElementLine [-50.00mil -50.00mil -50.00mil 350.00mil 10.00mil] + ElementLine [-50.00mil 350.00mil 350.00mil 350.00mil 10.00mil] + ElementLine [350.00mil 350.00mil 350.00mil -50.00mil 10.00mil] + ElementLine [-50.00mil -50.00mil 100.00mil -50.00mil 10.00mil] + ElementLine [200.00mil -50.00mil 350.00mil -50.00mil 10.00mil] + ElementArc [150.00mil -50.00mil 50.00mil 50.00mil 0 180 10.00mil] + + ) + +Element["" "R 0.5W" "R12" "" 1035.00mil 1935.00mil -205.00mil 700.00mil 0 150 ""] +( + Pin[0.0000 0.0000 85.00mil 30.00mil 115.00mil 48.00mil "1" "1" "square"] + Pin[0.0000 800.00mil 90.00mil 30.00mil 120.00mil 48.00mil "2" "2" ""] + ElementLine [0.0000 60.00mil 0.0000 115.00mil 10.00mil] + ElementLine [115.00mil 115.00mil -115.00mil 115.00mil 10.00mil] + ElementLine [-115.00mil 115.00mil -115.00mil 685.00mil 10.00mil] + ElementLine [-115.00mil 685.00mil 115.00mil 685.00mil 10.00mil] + ElementLine [115.00mil 685.00mil 115.00mil 115.00mil 10.00mil] + ElementLine [0.0000 685.00mil 0.0000 750.00mil 10.00mil] + + ) +Rat[1187.00mil 1553.00mil 0 1061.00mil 1553.00mil 0 ""] +Rat[1045.00mil 1820.00mil 1 1175.00mil 1780.00mil 0 ""] +Rat[1330.00mil 1185.00mil 1 1405.00mil 1315.00mil 0 ""] +Rat[2075.00mil 1455.00mil 1 2180.00mil 1420.00mil 0 ""] +Rat[2180.00mil 1420.00mil 0 2185.00mil 1310.00mil 0 ""] +Rat[2228.00mil 1547.00mil 0 2354.00mil 1547.00mil 0 ""] +Layer(1 "solder") +( + Line[1945.00mil 1015.00mil 1945.00mil 1260.00mil 15.00mil 30.00mil ""] + Line[1615.00mil 1960.00mil 1555.00mil 1960.00mil 10.00mil 30.00mil ""] + Line[1185.00mil 2230.00mil 1185.00mil 2655.00mil 15.00mil 30.00mil ""] + Line[705.00mil 795.00mil 890.00mil 980.00mil 15.00mil 30.00mil ""] + Line[1405.00mil 955.00mil 1485.00mil 875.00mil 15.00mil 30.00mil ""] + Line[1005.00mil 695.00mil 1140.00mil 560.00mil 15.00mil 30.00mil ""] + Line[1005.00mil 795.00mil 1135.00mil 665.00mil 15.00mil 30.00mil ""] + Line[705.00mil 895.00mil 705.00mil 1075.00mil 15.00mil 30.00mil ""] + Line[1125.00mil 1435.00mil 1005.00mil 1315.00mil 15.00mil 30.00mil ""] + Line[1005.00mil 1235.00mil 1065.00mil 1175.00mil 15.00mil 30.00mil ""] + Line[1010.00mil 980.00mil 1105.00mil 1075.00mil 15.00mil 30.00mil ""] + Line[1345.00mil 955.00mil 1405.00mil 955.00mil 15.00mil 30.00mil ""] + Line[1065.00mil 1175.00mil 1125.00mil 1175.00mil 15.00mil 30.00mil ""] + Line[1190.00mil 665.00mil 1295.00mil 560.00mil 15.00mil 30.00mil ""] + Line[1375.00mil 1750.00mil 1375.00mil 2040.00mil 15.00mil 30.00mil ""] + Line[1605.00mil 2435.00mil 1605.00mil 2660.00mil 10.00mil 30.00mil ""] + Line[1655.00mil 2285.00mil 1520.00mil 2420.00mil 15.00mil 30.00mil ""] + Line[1375.00mil 2040.00mil 1185.00mil 2230.00mil 15.00mil 30.00mil ""] + Line[1135.00mil 665.00mil 1190.00mil 665.00mil 15.00mil 30.00mil ""] + Line[1105.00mil 1075.00mil 970.00mil 1210.00mil 15.00mil 30.00mil ""] + Line[890.00mil 980.00mil 1010.00mil 980.00mil 15.00mil 30.00mil ""] + Line[2460.00mil 965.00mil 1995.00mil 965.00mil 15.00mil 30.00mil ""] + Line[1855.00mil 2285.00mil 1855.00mil 2585.00mil 15.00mil 30.00mil ""] + Line[970.00mil 1210.00mil 970.00mil 1568.00mil 15.00mil 30.00mil ""] + Line[1520.00mil 2420.00mil 1520.00mil 2495.00mil 15.00mil 30.00mil ""] + Line[1755.00mil 2285.00mil 1605.00mil 2435.00mil 10.00mil 30.00mil ""] + Line[1995.00mil 965.00mil 1945.00mil 1015.00mil 15.00mil 30.00mil ""] + Line[1005.00mil 1315.00mil 1005.00mil 1235.00mil 15.00mil 30.00mil ""] + Line[2565.00mil 1070.00mil 2460.00mil 965.00mil 15.00mil 30.00mil ""] + Line[1945.00mil 1260.00mil 1985.00mil 1300.00mil 15.00mil 30.00mil ""] + Line[1125.00mil 1175.00mil 1345.00mil 955.00mil 15.00mil 30.00mil ""] + Line[2400.00mil 2625.00mil 2290.00mil 2625.00mil 10.00mil 30.00mil ""] + Line[970.00mil 1568.00mil 820.00mil 1718.00mil 15.00mil 30.00mil ""] + Line[1140.00mil 560.00mil 1195.00mil 560.00mil 15.00mil 30.00mil ""] + Line[1555.00mil 1960.00mil 1555.00mil 2285.00mil 10.00mil 30.00mil ""] + Text[525.00mil 2805.00mil 0 120 "LED (BACK)" "onsolder"] +) +Layer(2 "GND-solder") +( + Line[820.00mil 2045.00mil 920.00mil 2145.00mil 35.00mil 30.00mil ""] + Line[930.00mil 1820.00mil 930.00mil 1932.00mil 30.00mil 30.00mil ""] + Line[1280.00mil 1585.00mil 1045.00mil 1820.00mil 30.00mil 30.00mil ""] + Line[1045.00mil 1820.00mil 930.00mil 1820.00mil 30.00mil 30.00mil ""] + Line[930.00mil 1932.00mil 820.00mil 2042.00mil 30.00mil 30.00mil ""] + Line[2155.00mil 815.00mil 2120.00mil 780.00mil 40.00mil 30.00mil ""] + Line[1675.00mil 780.00mil 1595.00mil 860.00mil 40.00mil 30.00mil ""] + Line[2630.00mil 850.00mil 2535.00mil 755.00mil 40.00mil 30.00mil ""] + Line[2120.00mil 780.00mil 1675.00mil 780.00mil 40.00mil 30.00mil ""] + Line[2215.00mil 755.00mil 2155.00mil 815.00mil 40.00mil 30.00mil ""] + Line[2535.00mil 755.00mil 2215.00mil 755.00mil 40.00mil 30.00mil ""] + Polygon("clearpoly") + ( + [1125.00mil 2635.00mil] [1125.00mil 2235.00mil] [1330.00mil 2030.00mil] [1330.00mil 1705.00mil] [1430.00mil 1705.00mil] + [1430.00mil 1635.00mil] [1400.00mil 1635.00mil] [1400.00mil 1560.00mil] [1240.00mil 1720.00mil] [1115.00mil 1845.00mil] + [1115.00mil 2010.00mil] [1030.00mil 2010.00mil] [895.00mil 2145.00mil] [895.00mil 2635.00mil] + ) + Polygon("clearpoly") + ( + [1430.00mil 1885.00mil] [1570.00mil 1885.00mil] [1670.00mil 1885.00mil] [1670.00mil 2000.00mil] [1590.00mil 2000.00mil] + [1590.00mil 2235.00mil] [1925.00mil 2235.00mil] [1925.00mil 2525.00mil] [2645.00mil 2525.00mil] [2645.00mil 1250.00mil] + [2405.00mil 1250.00mil] [2405.00mil 1340.00mil] [2370.00mil 1375.00mil] [2320.00mil 1375.00mil] [2285.00mil 1340.00mil] + [2285.00mil 1305.00mil] [2300.00mil 1290.00mil] [2300.00mil 1290.00mil] [2300.00mil 1135.00mil] [2430.00mil 1135.00mil] + [2430.00mil 1005.00mil] [2090.00mil 1005.00mil] [2090.00mil 1280.00mil] [2000.00mil 1370.00mil] [2000.00mil 1515.00mil] + [1370.00mil 1515.00mil] [1370.00mil 1640.00mil] [1430.00mil 1640.00mil] + ) + Polygon("clearpoly") + ( + [2635.00mil 1250.00mil] [2635.00mil 1615.00mil] [2895.00mil 1615.00mil] [2895.00mil 1785.00mil] [2750.00mil 1785.00mil] + [2750.00mil 2520.00mil] [2975.00mil 2520.00mil] [2975.00mil 1250.00mil] + ) +) +Layer(3 "Vcc-solder") +( + Line[1455.00mil 2780.00mil 2695.00mil 2780.00mil 35.00mil 30.00mil ""] + Line[1035.00mil 2735.00mil 1445.00mil 2735.00mil 45.00mil 30.00mil ""] + Line[2340.00mil 1195.00mil 2815.00mil 1195.00mil 30.00mil 30.00mil ""] + Line[2815.00mil 1195.00mil 2815.00mil 900.00mil 30.00mil 30.00mil ""] + Line[1530.00mil 1180.00mil 1530.00mil 1435.00mil 30.00mil 30.00mil ""] + Line[1070.00mil 1265.00mil 1525.00mil 1265.00mil 35.00mil 30.00mil ""] + Line[1145.00mil 765.00mil 1395.00mil 765.00mil 35.00mil 30.00mil ""] + Line[1010.00mil 900.00mil 1145.00mil 765.00mil 35.00mil 30.00mil ""] + Line[1395.00mil 765.00mil 1595.00mil 565.00mil 35.00mil 30.00mil ""] + Line[2155.00mil 615.00mil 2110.00mil 660.00mil 40.00mil 30.00mil ""] + Line[1695.00mil 660.00mil 1595.00mil 560.00mil 40.00mil 30.00mil ""] + Line[2330.00mil 550.00mil 2155.00mil 615.00mil 45.00mil 30.00mil ""] + Line[2110.00mil 660.00mil 1695.00mil 660.00mil 40.00mil 30.00mil ""] + Line[2340.00mil 1315.00mil 2340.00mil 1195.00mil 30.00mil 30.00mil ""] + Line[2695.00mil 1700.00mil 2810.00mil 1700.00mil 30.00mil 30.00mil ""] + Line[1455.00mil 2585.00mil 1355.00mil 2285.00mil 45.00mil 30.00mil ""] + Line[1455.00mil 2590.00mil 1455.00mil 2780.00mil 35.00mil 30.00mil ""] + Line[2695.00mil 2780.00mil 2695.00mil 1700.00mil 30.00mil 30.00mil ""] +) +Layer(4 "component") +( + Line[2675.00mil 2125.00mil 2575.00mil 2025.00mil 15.00mil 30.00mil ""] + Line[2120.00mil 2285.00mil 2180.00mil 2225.00mil 15.00mil 30.00mil ""] + Line[2055.00mil 720.00mil 2055.00mil 895.00mil 10.00mil 30.00mil ""] + Line[1835.00mil 1285.00mil 1835.00mil 1340.00mil 10.00mil 30.00mil ""] + Line[1860.00mil 1261.00mil 1835.00mil 1285.00mil 10.00mil 30.00mil ""] + Line[1860.00mil 1035.00mil 1860.00mil 1261.00mil 10.00mil 30.00mil ""] + Line[2090.00mil 655.00mil 2090.00mil 910.00mil 10.00mil 30.00mil ""] + Line[1995.00mil 560.00mil 2090.00mil 655.00mil 10.00mil 30.00mil ""] + Line[1809.00mil 1263.00mil 1809.00mil 1340.00mil 10.00mil 30.00mil ""] + Line[1829.00mil 1244.00mil 1809.00mil 1263.00mil 10.00mil 30.00mil ""] + Line[1829.00mil 1024.00mil 1829.00mil 1244.00mil 10.00mil 30.00mil ""] + Line[1991.00mil 959.00mil 1893.00mil 959.00mil 10.00mil 30.00mil ""] + Line[2235.00mil 1500.00mil 2235.00mil 1475.00mil 15.00mil 30.00mil ""] + Line[2055.00mil 895.00mil 1991.00mil 959.00mil 10.00mil 30.00mil ""] + Line[2075.00mil 2515.00mil 2075.00mil 2415.00mil 30.00mil 30.00mil ""] + Line[1490.00mil 1950.00mil 1505.00mil 1950.00mil 10.00mil 30.00mil ""] + Line[2075.00mil 2415.00mil 1520.00mil 2415.00mil 30.00mil 30.00mil ""] + Line[2175.00mil 2145.00mil 2205.00mil 2145.00mil 15.00mil 30.00mil ""] + Line[1655.00mil 1800.00mil 1656.00mil 1720.00mil 10.00mil 30.00mil ""] + Line[1490.00mil 1950.00mil 1490.00mil 2150.00mil 15.00mil 30.00mil ""] + Line[1745.00mil 1845.00mil 1635.00mil 1955.00mil 15.00mil 30.00mil ""] + Line[1775.00mil 1780.00mil 1707.00mil 1780.00mil 10.00mil 30.00mil ""] + Line[1655.00mil 2170.00mil 1945.00mil 2170.00mil 15.00mil 30.00mil ""] + Line[1950.00mil 2285.00mil 2070.00mil 2285.00mil 15.00mil 30.00mil ""] + Line[1655.00mil 2170.00mil 1635.00mil 2150.00mil 15.00mil 30.00mil ""] + Line[1655.00mil 2065.00mil 1835.00mil 1885.00mil 15.00mil 30.00mil ""] + Line[2015.00mil 1955.00mil 2255.00mil 1955.00mil 15.00mil 30.00mil ""] + Line[2180.00mil 2625.00mil 2290.00mil 2625.00mil 15.00mil 30.00mil ""] + Line[2075.00mil 2615.00mil 1985.00mil 2615.00mil 15.00mil 30.00mil ""] + Line[2125.00mil 2585.00mil 2290.00mil 2420.00mil 10.00mil 30.00mil ""] + Line[2205.00mil 2145.00mil 2270.00mil 2080.00mil 15.00mil 30.00mil ""] + Line[1315.00mil 2225.00mil 1255.00mil 2285.00mil 15.00mil 30.00mil ""] + Line[1855.00mil 2285.00mil 1795.00mil 2225.00mil 15.00mil 30.00mil ""] + Line[2125.00mil 2615.00mil 2125.00mil 2585.00mil 10.00mil 30.00mil ""] + Line[2495.00mil 2530.00mil 2400.00mil 2625.00mil 15.00mil 30.00mil ""] + Line[1795.00mil 2225.00mil 1315.00mil 2225.00mil 15.00mil 30.00mil ""] + Line[1520.00mil 2415.00mil 1455.00mil 2285.00mil 30.00mil 30.00mil ""] + Line[2440.00mil 2110.00mil 2345.00mil 2205.00mil 15.00mil 30.00mil ""] + Line[1490.00mil 1750.00mil 1600.00mil 1750.00mil 10.00mil 30.00mil ""] + Line[2075.00mil 2615.00mil 2125.00mil 2615.00mil 10.00mil 30.00mil ""] + Line[2875.00mil 1800.00mil 2755.00mil 1800.00mil 15.00mil 30.00mil ""] + Line[1635.00mil 2150.00mil 1375.00mil 2150.00mil 15.00mil 30.00mil ""] + Line[1835.00mil 1840.00mil 1775.00mil 1780.00mil 10.00mil 30.00mil ""] + Line[2000.00mil 2225.00mil 2095.00mil 2225.00mil 15.00mil 30.00mil ""] + Line[1732.00mil 1750.00mil 1732.00mil 1720.00mil 10.00mil 30.00mil ""] + Line[1911.00mil 1720.00mil 1937.00mil 1720.00mil 10.00mil 30.00mil ""] + Line[1985.00mil 1300.00mil 1937.00mil 1300.00mil 10.00mil 30.00mil ""] + Line[2015.00mil 985.00mil 1909.00mil 985.00mil 10.00mil 30.00mil ""] + Line[1860.00mil 1720.00mil 1886.00mil 1720.00mil 10.00mil 30.00mil ""] + Line[1745.00mil 1845.00mil 1681.00mil 1845.00mil 10.00mil 30.00mil ""] + Line[1950.00mil 1840.00mil 1835.00mil 1840.00mil 15.00mil 30.00mil ""] + Line[1707.00mil 1780.00mil 1707.00mil 1720.00mil 10.00mil 30.00mil ""] + Line[1681.00mil 1845.00mil 1681.00mil 1720.00mil 10.00mil 30.00mil ""] + Line[1122.00mil 2585.00mil 1122.00mil 2740.00mil 15.00mil 30.00mil ""] + Line[2070.00mil 2285.00mil 2120.00mil 2285.00mil 15.00mil 30.00mil ""] + Line[1490.00mil 1750.00mil 1375.00mil 1750.00mil 15.00mil 30.00mil ""] + Line[1950.00mil 1840.00mil 2015.00mil 1955.00mil 15.00mil 30.00mil ""] + Line[1635.00mil 1955.00mil 1615.00mil 1955.00mil 10.00mil 30.00mil ""] + Line[2160.00mil 1750.00mil 1732.00mil 1750.00mil 10.00mil 30.00mil ""] + Line[2160.00mil 1675.00mil 2440.00mil 1955.00mil 15.00mil 30.00mil ""] + Line[2160.00mil 1680.00mil 2160.00mil 1750.00mil 10.00mil 30.00mil ""] + Line[1945.00mil 2170.00mil 2000.00mil 2225.00mil 15.00mil 30.00mil ""] + Line[1505.00mil 1950.00mil 1655.00mil 1800.00mil 10.00mil 30.00mil ""] + Line[1190.00mil 1595.00mil 1190.00mil 1675.00mil 15.00mil 30.00mil ""] + Line[1190.00mil 1510.00mil 1190.00mil 1435.00mil 15.00mil 30.00mil ""] + Line[1190.00mil 1435.00mil 1130.00mil 1435.00mil 15.00mil 30.00mil ""] + Line[1695.00mil 860.00mil 1695.00mil 1276.00mil 10.00mil 30.00mil ""] + Line[1795.00mil 860.00mil 1732.00mil 923.00mil 10.00mil 30.00mil ""] + Line[1797.00mil 1015.00mil 1797.00mil 1225.00mil 10.00mil 30.00mil ""] + Line[1995.00mil 860.00mil 1927.00mil 927.00mil 10.00mil 30.00mil ""] + Line[1495.00mil 560.00mil 1646.00mil 711.00mil 10.00mil 30.00mil ""] + Line[1657.00mil 973.00mil 1657.00mil 1279.00mil 10.00mil 30.00mil ""] + Line[1657.00mil 1279.00mil 1681.00mil 1303.00mil 10.00mil 30.00mil ""] + Line[1681.00mil 1303.00mil 1681.00mil 1340.00mil 10.00mil 30.00mil ""] + Line[1927.00mil 927.00mil 1885.00mil 927.00mil 10.00mil 30.00mil ""] + Line[1895.00mil 860.00mil 1758.00mil 997.00mil 10.00mil 30.00mil ""] + Line[1732.00mil 923.00mil 1732.00mil 1340.00mil 10.00mil 30.00mil ""] + Line[1893.00mil 959.00mil 1829.00mil 1024.00mil 10.00mil 30.00mil ""] + Line[1646.00mil 962.00mil 1657.00mil 973.00mil 10.00mil 30.00mil ""] + Line[1797.00mil 1225.00mil 1784.00mil 1239.00mil 10.00mil 30.00mil ""] + Line[1646.00mil 711.00mil 1646.00mil 962.00mil 10.00mil 30.00mil ""] + Line[1895.00mil 560.00mil 2055.00mil 720.00mil 10.00mil 30.00mil ""] + Line[1885.00mil 927.00mil 1797.00mil 1015.00mil 10.00mil 30.00mil ""] + Line[2090.00mil 910.00mil 2015.00mil 985.00mil 10.00mil 30.00mil ""] + Line[1985.00mil 2615.00mil 1955.00mil 2585.00mil 15.00mil 30.00mil ""] + Line[1758.00mil 997.00mil 1758.00mil 1340.00mil 10.00mil 30.00mil ""] + Line[1707.00mil 1288.00mil 1707.00mil 1340.00mil 10.00mil 30.00mil ""] + Line[2235.00mil 1475.00mil 2275.00mil 1435.00mil 15.00mil 30.00mil ""] + Line[1909.00mil 985.00mil 1860.00mil 1035.00mil 10.00mil 30.00mil ""] + Line[1005.00mil 1195.00mil 1005.00mil 895.00mil 35.00mil 30.00mil ""] + Line[1060.00mil 1255.00mil 1005.00mil 1195.00mil 35.00mil 30.00mil ""] + Line[585.00mil 2350.00mil 585.00mil 1787.00mil 35.00mil 30.00mil ""] + Line[705.00mil 595.00mil 875.00mil 765.00mil 15.00mil 30.00mil ""] + Line[795.00mil 785.00mil 795.00mil 1155.00mil 15.00mil 30.00mil ""] + Line[2555.00mil 475.00mil 1480.00mil 475.00mil 15.00mil 30.00mil ""] + Line[2630.00mil 550.00mil 2555.00mil 475.00mil 15.00mil 30.00mil ""] + Line[1455.00mil 2285.00mil 1290.00mil 2450.00mil 35.00mil 30.00mil ""] + Line[875.00mil 765.00mil 875.00mil 1165.00mil 15.00mil 30.00mil ""] + Line[705.00mil 695.00mil 795.00mil 785.00mil 15.00mil 30.00mil ""] + Line[980.00mil 1774.00mil 820.00mil 1934.00mil 15.00mil 30.00mil ""] + Line[705.00mil 1075.00mil 635.00mil 1145.00mil 15.00mil 30.00mil ""] + Line[2290.00mil 2420.00mil 2290.00mil 2225.00mil 10.00mil 30.00mil ""] + Line[1480.00mil 475.00mil 1395.00mil 560.00mil 15.00mil 30.00mil ""] + Line[635.00mil 1425.00mil 820.00mil 1610.00mil 15.00mil 30.00mil ""] + Line[875.00mil 1165.00mil 980.00mil 1270.00mil 15.00mil 30.00mil ""] + Line[2095.00mil 2225.00mil 2175.00mil 2145.00mil 15.00mil 30.00mil ""] + Line[1290.00mil 2450.00mil 685.00mil 2450.00mil 35.00mil 30.00mil ""] + Line[1600.00mil 1750.00mil 1630.00mil 1720.00mil 10.00mil 30.00mil ""] + Line[1897.00mil 2827.00mil 1897.00mil 2925.00mil 15.00mil 30.00mil ""] + Line[915.00mil 1731.00mil 820.00mil 1826.00mil 15.00mil 30.00mil ""] + Line[915.00mil 1275.00mil 915.00mil 1731.00mil 15.00mil 30.00mil ""] + Line[1755.00mil 2585.00mil 2091.00mil 2925.00mil 15.00mil 30.00mil ""] + Line[1501.00mil 2764.00mil 1501.00mil 2925.00mil 15.00mil 30.00mil ""] + Line[1655.00mil 2585.00mil 1897.00mil 2827.00mil 15.00mil 30.00mil ""] + Line[1182.00mil 2525.00mil 1122.00mil 2585.00mil 15.00mil 30.00mil ""] + Line[1520.00mil 2495.00mil 1490.00mil 2525.00mil 15.00mil 30.00mil ""] + Line[1490.00mil 2525.00mil 1182.00mil 2525.00mil 15.00mil 30.00mil ""] + Line[1605.00mil 2660.00mil 1501.00mil 2764.00mil 15.00mil 30.00mil ""] + Line[1185.00mil 2655.00mil 1485.00mil 2655.00mil 15.00mil 30.00mil ""] + Line[1485.00mil 2655.00mil 1555.00mil 2585.00mil 15.00mil 30.00mil ""] + Line[1122.00mil 2740.00mil 1307.00mil 2925.00mil 15.00mil 30.00mil ""] + Line[2255.00mil 1955.00mil 2375.00mil 2075.00mil 15.00mil 30.00mil ""] + Line[2440.00mil 1955.00mil 2440.00mil 2110.00mil 15.00mil 30.00mil ""] + Line[2345.00mil 2865.00mil 2285.00mil 2925.00mil 15.00mil 30.00mil ""] + Line[2345.00mil 2205.00mil 2345.00mil 2865.00mil 15.00mil 30.00mil ""] + Line[2785.00mil 2215.00mil 2785.00mil 2375.00mil 15.00mil 30.00mil ""] + Line[795.00mil 1155.00mil 915.00mil 1275.00mil 15.00mil 30.00mil ""] + Line[2875.00mil 2225.00mil 2875.00mil 2375.00mil 15.00mil 30.00mil ""] + Line[1784.00mil 1239.00mil 1784.00mil 1340.00mil 10.00mil 30.00mil ""] + Line[2575.00mil 2125.00mil 2495.00mil 2215.00mil 15.00mil 30.00mil ""] + Line[2665.00mil 2375.00mil 2785.00mil 2375.00mil 15.00mil 30.00mil ""] + Line[2575.00mil 2225.00mil 2575.00mil 2375.00mil 15.00mil 30.00mil ""] + Line[2495.00mil 2215.00mil 2495.00mil 2530.00mil 15.00mil 30.00mil ""] + Line[2875.00mil 1925.00mil 2875.00mil 1800.00mil 15.00mil 30.00mil ""] + Line[2875.00mil 2125.00mil 2785.00mil 2215.00mil 15.00mil 30.00mil ""] + Line[1937.00mil 1300.00mil 1937.00mil 1340.00mil 10.00mil 30.00mil ""] + Line[2875.00mil 2125.00mil 2675.00mil 2125.00mil 15.00mil 30.00mil ""] + Line[635.00mil 1145.00mil 635.00mil 1425.00mil 15.00mil 30.00mil ""] + Line[1835.00mil 1885.00mil 1835.00mil 1840.00mil 15.00mil 30.00mil ""] + Line[1695.00mil 1276.00mil 1707.00mil 1288.00mil 10.00mil 30.00mil ""] + Line[685.00mil 2450.00mil 585.00mil 2350.00mil 35.00mil 30.00mil ""] + Line[2975.00mil 1480.00mil 2565.00mil 1070.00mil 15.00mil 30.00mil ""] + Line[2975.00mil 2025.00mil 2975.00mil 1480.00mil 15.00mil 30.00mil ""] + Line[2875.00mil 2125.00mil 2975.00mil 2025.00mil 15.00mil 30.00mil ""] + Line[980.00mil 1270.00mil 980.00mil 1774.00mil 15.00mil 30.00mil ""] + Line[585.00mil 1787.00mil 708.00mil 1664.00mil 35.00mil 30.00mil ""] + Text[2515.00mil 2705.00mil 0 140 "LED rev 1" ""] +) +Layer(5 "GND-component") +( + Line[1505.00mil 950.00mil 1595.00mil 860.00mil 30.00mil 30.00mil ""] + Line[1440.00mil 950.00mil 1505.00mil 950.00mil 30.00mil 30.00mil ""] + Line[2220.00mil 1545.00mil 2155.00mil 1545.00mil 20.00mil 30.00mil ""] + Line[2515.00mil 1350.00mil 2515.00mil 1415.00mil 30.00mil 30.00mil ""] + Line[1200.00mil 1350.00mil 1230.00mil 1350.00mil 35.00mil 30.00mil ""] + Line[1860.00mil 1395.00mil 1860.00mil 1430.00mil 10.00mil 30.00mil ""] + Line[1965.00mil 1495.00mil 1965.00mil 1635.00mil 25.00mil 30.00mil ""] + Line[1855.00mil 1495.00mil 1965.00mil 1495.00mil 25.00mil 30.00mil ""] + Line[1835.00mil 1665.00mil 1835.00mil 1625.00mil 10.00mil 30.00mil ""] + Line[1885.00mil 1395.00mil 1885.00mil 1460.00mil 10.00mil 30.00mil ""] + Line[1965.00mil 1660.00mil 1965.00mil 1635.00mil 10.00mil 30.00mil ""] + Line[1810.00mil 1665.00mil 1810.00mil 1630.00mil 10.00mil 30.00mil ""] + Line[1785.00mil 1660.00mil 1785.00mil 1625.00mil 10.00mil 30.00mil ""] + Line[1760.00mil 1625.00mil 1760.00mil 1660.00mil 10.00mil 30.00mil ""] + Line[1280.00mil 1580.00mil 1280.00mil 1490.00mil 25.00mil 30.00mil ""] + Line[1195.00mil 1555.00mil 1280.00mil 1555.00mil 20.00mil 30.00mil ""] + Line[2545.00mil 1320.00mil 2515.00mil 1350.00mil 30.00mil 30.00mil ""] + Line[1005.00mil 595.00mil 1085.00mil 595.00mil 30.00mil 30.00mil ""] + Line[1085.00mil 595.00mil 1085.00mil 955.00mil 30.00mil 30.00mil ""] + Line[1085.00mil 955.00mil 1145.00mil 1015.00mil 30.00mil 30.00mil ""] + Line[1145.00mil 1015.00mil 1245.00mil 1015.00mil 30.00mil 30.00mil ""] + Arc[1445.00mil 995.00mil 45.00mil 45.00mil 30.00mil 30.00mil 270 90 ""] + Polygon("clearpoly") + ( + [2250.00mil 1535.00mil] [2270.00mil 1535.00mil] [2270.00mil 1485.00mil] [2325.00mil 1485.00mil] [2325.00mil 1535.00mil] + [2345.00mil 1535.00mil] [2345.00mil 1560.00mil] [2325.00mil 1560.00mil] [2325.00mil 1630.00mil] [2160.00mil 1630.00mil] + [2160.00mil 1610.00mil] [2270.00mil 1610.00mil] [2270.00mil 1560.00mil] [2250.00mil 1560.00mil] + ) + Polygon("clearpoly") + ( + [1995.00mil 1470.00mil] [1880.00mil 1470.00mil] [1880.00mil 1450.00mil] [2015.00mil 1450.00mil] [2015.00mil 1365.00mil] + [2160.00mil 1365.00mil] [2160.00mil 1330.00mil] [2195.00mil 1330.00mil] [2195.00mil 1425.00mil] [2160.00mil 1460.00mil] + [2160.00mil 1630.00mil] [2070.00mil 1630.00mil] [2070.00mil 1720.00mil] [1995.00mil 1720.00mil] + ) + Polygon("clearpoly") + ( + [1370.00mil 1635.00mil] [1930.00mil 1635.00mil] [1930.00mil 1525.00mil] [1370.00mil 1525.00mil] + ) + Polygon("clearpoly") + ( + [1865.00mil 1510.00mil] [1225.00mil 1510.00mil] [1225.00mil 995.00mil] [1415.00mil 995.00mil] [1415.00mil 1255.00mil] + [1365.00mil 1255.00mil] [1365.00mil 1365.00mil] [1605.00mil 1365.00mil] [1605.00mil 1415.00mil] [1865.00mil 1415.00mil] + ) + Polygon("") + ( + [1360.00mil 1295.00mil] [1390.00mil 1295.00mil] [1390.00mil 1335.00mil] [1360.00mil 1335.00mil] + ) + Polygon("clearpoly") + ( + [1070.00mil 1565.00mil] [1090.00mil 1565.00mil] [1090.00mil 1810.00mil] [1150.00mil 1810.00mil] [1150.00mil 1765.00mil] + [1125.00mil 1740.00mil] [1125.00mil 1640.00mil] [1145.00mil 1640.00mil] [1145.00mil 1565.00mil] [1165.00mil 1565.00mil] + [1165.00mil 1540.00mil] [1145.00mil 1540.00mil] [1145.00mil 1485.00mil] [1090.00mil 1485.00mil] [1090.00mil 1540.00mil] + [1070.00mil 1540.00mil] + ) +) +Layer(6 "Vcc-component") +( + Line[1045.00mil 1870.00mil 1045.00mil 1935.00mil 25.00mil 30.00mil ""] + Line[708.00mil 2155.00mil 708.00mil 1988.00mil 40.00mil 30.00mil ""] + Line[2575.00mil 1925.00mil 2490.00mil 2010.00mil 25.00mil 30.00mil ""] + Line[1630.00mil 1340.00mil 1630.00mil 1250.00mil 10.00mil 30.00mil ""] + Line[1910.00mil 1430.00mil 1965.00mil 1430.00mil 10.00mil 30.00mil ""] + Line[1910.00mil 1395.00mil 1910.00mil 1430.00mil 10.00mil 30.00mil ""] + Line[1200.00mil 2355.00mil 1000.00mil 2155.00mil 35.00mil 30.00mil ""] + Line[2575.00mil 1925.00mil 2485.00mil 1835.00mil 25.00mil 30.00mil ""] + Line[1070.00mil 1265.00mil 1070.00mil 1330.00mil 25.00mil 30.00mil ""] + Line[2360.00mil 1500.00mil 2360.00mil 1315.00mil 25.00mil 30.00mil ""] + Line[2445.00mil 1250.00mil 2445.00mil 1675.00mil 30.00mil 30.00mil ""] + Line[2100.00mil 1250.00mil 2445.00mil 1250.00mil 30.00mil 30.00mil ""] + Line[1910.00mil 1340.00mil 1910.00mil 1250.00mil 10.00mil 30.00mil ""] + Line[1965.00mil 1430.00mil 1965.00mil 1400.00mil 10.00mil 30.00mil ""] + Line[2375.00mil 1585.00mil 2440.00mil 1585.00mil 25.00mil 30.00mil ""] + Line[2665.00mil 1835.00mil 2575.00mil 1925.00mil 30.00mil 30.00mil ""] + Line[1120.00mil 1875.00mil 1190.00mil 1875.00mil 20.00mil 30.00mil ""] + Line[1045.00mil 1595.00mil 1045.00mil 1875.00mil 20.00mil 30.00mil ""] + Line[1045.00mil 1875.00mil 1120.00mil 1875.00mil 20.00mil 30.00mil ""] + Line[2875.00mil 2025.00mil 2675.00mil 2025.00mil 25.00mil 30.00mil ""] + Line[1285.00mil 2355.00mil 1200.00mil 2355.00mil 35.00mil 30.00mil ""] + Line[1355.00mil 2285.00mil 1285.00mil 2355.00mil 35.00mil 30.00mil ""] + Line[2675.00mil 2025.00mil 2575.00mil 1925.00mil 25.00mil 30.00mil ""] + Line[1000.00mil 2155.00mil 708.00mil 2155.00mil 40.00mil 30.00mil ""] + Line[1060.00mil 1510.00mil 1060.00mil 1375.00mil 25.00mil 30.00mil ""] + Line[1190.00mil 1875.00mil 1280.00mil 1785.00mil 20.00mil 30.00mil ""] + Line[2490.00mil 2010.00mil 2490.00mil 2135.00mil 25.00mil 30.00mil ""] + Line[2450.00mil 1510.00mil 2495.00mil 1510.00mil 35.00mil 30.00mil ""] + Line[2485.00mil 1835.00mil 2485.00mil 1680.00mil 25.00mil 30.00mil ""] + Line[2485.00mil 1680.00mil 2375.00mil 1680.00mil 25.00mil 30.00mil ""] + Line[2665.00mil 1800.00mil 2665.00mil 1835.00mil 30.00mil 30.00mil ""] + Line[2375.00mil 1680.00mil 2270.00mil 1680.00mil 30.00mil 30.00mil ""] + Line[2490.00mil 2135.00mil 2400.00mil 2225.00mil 25.00mil 30.00mil ""] + Polygon("") + ( + [1500.00mil 1255.00mil] [1530.00mil 1255.00mil] [1530.00mil 1295.00mil] [1500.00mil 1295.00mil] + ) + Polygon("clearpoly") + ( + [1445.00mil 1255.00mil] [1635.00mil 1255.00mil] [1635.00mil 995.00mil] [1635.00mil 995.00mil] [1635.00mil 995.00mil] + [1635.00mil 995.00mil] [1635.00mil 995.00mil] [1445.00mil 995.00mil] + ) + Polygon("clearpoly") + ( + [1885.00mil 1260.00mil] [2120.00mil 1260.00mil] [2120.00mil 1005.00mil] [1921.00mil 1003.00mil] [1885.00mil 1039.00mil] + ) + Polygon("") + ( + [2080.00mil 1250.00mil] [2110.00mil 1250.00mil] [2110.00mil 1295.00mil] [2080.00mil 1295.00mil] + ) +) +Layer(7 "unused") +( +) +Layer(8 "unused") +( + Line[3135.00mil 3225.00mil 345.00mil 3225.00mil 35.00mil 30.00mil ""] + Line[3135.00mil 210.00mil 3135.00mil 3225.00mil 35.00mil 30.00mil ""] + Line[345.00mil 210.00mil 3135.00mil 210.00mil 35.00mil 30.00mil ""] + Line[345.00mil 3225.00mil 345.00mil 210.00mil 35.00mil 30.00mil ""] +) +Layer(9 "silk") +( +) +Layer(10 "silk") +( + Text[2210.00mil 3120.00mil 0 115 "ANODE" ""] + Text[1855.00mil 3125.00mil 0 115 "-Y" ""] + Text[2045.00mil 3130.00mil 0 115 "+Y" ""] + Text[1255.00mil 3125.00mil 0 115 "-X" ""] + Text[1455.00mil 3125.00mil 0 115 "+X" ""] + Text[525.00mil 295.00mil 0 280 "FLARE GENESIS" ""] + Text[435.00mil 2815.00mil 0 165 "LED Interface" ""] + Text[1885.00mil 285.00mil 0 295 "harry eaton" ""] +) +NetList() +( + Net("AGND" "(unknown)") + ( + Connect("C8-2") + Connect("C9-2") + Connect("C10-2") + Connect("C11-2") + Connect("C12-2") + Connect("C13-2") + Connect("C20-2") + Connect("C21-2") + Connect("R7-2") + Connect("R9-2") + Connect("R10-2") + Connect("U2-6") + Connect("U2-7") + Connect("U2-8") + Connect("U2-9") + Connect("U2-18") + Connect("U3-2") + Connect("U3-5") + Connect("U7-4") + ) + Net("DGND" "(unknown)") + ( + Connect("C5-2") + Connect("C6-2") + Connect("C7-2") + Connect("C14-2") + Connect("C15-2") + Connect("C16-2") + Connect("C17-1") + Connect("J3-1") + Connect("U2-14") + Connect("U2-19") + Connect("U4-2") + Connect("U4-5") + Connect("U5-5") + Connect("U6-4") + Connect("X1-2") + ) + Net("Minus12V" "(unknown)") + ( + Connect("C3-1") + Connect("C4-1") + Connect("J3-9") + Connect("U1-6") + ) + Net("Plus12V" "(unknown)") + ( + Connect("J3-6") + Connect("R11-1") + Connect("R12-2") + Connect("U1-7") + Connect("U1-11") + ) + Net("S00001" "(unknown)") + ( + Connect("C8-1") + Connect("C9-1") + Connect("C10-1") + Connect("C13-1") + Connect("C18-1") + Connect("R2-2") + Connect("R6-1") + Connect("R8-1") + Connect("U2-15") + Connect("U2-17") + Connect("U3-4") + Connect("U7-1") + Connect("U7-7") + ) + Net("SIG 51" "(unknown)") + ( + Connect("C1-1") + Connect("R5-2") + Connect("R8-2") + Connect("R9-1") + Connect("U2-2") + ) + Net("SIG52" "(unknown)") + ( + Connect("C1-2") + Connect("R5-1") + Connect("U1-12") + Connect("U2-1") + ) + Net("SIG87" "(unknown)") + ( + Connect("U2-10") + Connect("U2-11") + ) + Net("SIG88" "(unknown)") + ( + Connect("U2-12") + Connect("U2-13") + ) + Net("SIG91" "(unknown)") + ( + Connect("C19-1") + Connect("C20-1") + Connect("C21-1") + Connect("U2-16") + Connect("U7-2") + Connect("U7-6") + ) + Net("SIG100" "(unknown)") + ( + Connect("U2-21") + Connect("U5-11") + ) + Net("SIG101" "(unknown)") + ( + Connect("U2-20") + Connect("U5-10") + ) + Net("SIG124" "(unknown)") + ( + Connect("J2-3") + Connect("U1-4") + ) + Net("SIG125" "(unknown)") + ( + Connect("J2-2") + Connect("U1-3") + ) + Net("SIG127" "(unknown)") + ( + Connect("J1-2") + Connect("U1-14") + ) + Net("SIG139" "(unknown)") + ( + Connect("C11-1") + Connect("U3-1") + ) + Net("SIG146" "(unknown)") + ( + Connect("C12-1") + Connect("R11-2") + Connect("U3-6") + ) + Net("SIG150" "(unknown)") + ( + Connect("C15-1") + Connect("R12-1") + Connect("U4-6") + ) + Net("SIG155" "(unknown)") + ( + Connect("C14-1") + Connect("U4-1") + ) + Net("SIG191" "(unknown)") + ( + Connect("U5-16") + Connect("X1-3") + ) + Net("SIG241" "(unknown)") + ( + Connect("U2-26") + Connect("U5-15") + ) + Net("SIG252" "(unknown)") + ( + Connect("R13-1") + Connect("U4-3") + Connect("U5-4") + ) + Net("SIG258" "(unknown)") + ( + Connect("U5-18") + Connect("U6-3") + ) + Net("SIG259" "(unknown)") + ( + Connect("U5-17") + Connect("U6-2") + ) + Net("SIG285" "(unknown)") + ( + Connect("J3-4") + Connect("R14-1") + Connect("U6-7") + ) + Net("SIG286" "(unknown)") + ( + Connect("J3-5") + Connect("R14-2") + Connect("U6-8") + ) + Net("SIG291" "(unknown)") + ( + Connect("U2-22") + Connect("U5-9") + ) + Net("SIG292" "(unknown)") + ( + Connect("U2-23") + Connect("U5-8") + ) + Net("SIG293" "(unknown)") + ( + Connect("U2-24") + Connect("U5-7") + ) + Net("SIG294" "(unknown)") + ( + Connect("U2-25") + Connect("U5-6") + ) + Net("SIG296" "(unknown)") + ( + Connect("J3-2") + Connect("U6-5") + ) + Net("SIG297" "(unknown)") + ( + Connect("J3-3") + Connect("U6-6") + ) + Net("SIG310" "(unknown)") + ( + Connect("J1-1") + Connect("R10-1") + Connect("U2-5") + ) + Net("SIG311" "(unknown)") + ( + Connect("J1-3") + Connect("U1-13") + ) + Net("SIG321" "(unknown)") + ( + Connect("C5-1") + Connect("C6-1") + Connect("C7-1") + Connect("C16-1") + Connect("C17-2") + Connect("R13-2") + Connect("U2-28") + Connect("U4-4") + Connect("U5-14") + Connect("U6-1") + Connect("X1-4") + ) + Net("SIG338" "(unknown)") + ( + Connect("R1-1") + Connect("R2-1") + Connect("R3-1") + Connect("U7-3") + ) + Net("SIG341" "(unknown)") + ( + Connect("C18-2") + Connect("U7-8") + ) + Net("SIG343" "(unknown)") + ( + Connect("C19-2") + Connect("U7-5") + ) + Net("THISIS 13 CHA" "(unknown)") + ( + Connect("C2-1") + Connect("R4-2") + Connect("R6-2") + Connect("R7-1") + Connect("U2-4") + ) + Net("THISIS12CHAR" "(unknown)") + ( + Connect("C4-2") + Connect("R1-2") + Connect("U1-1") + ) + Net("THISIS14CHARAC" "Skinny") + ( + Connect("U1-2") + Connect("U1-8") + Connect("U1-15") + ) + Net("THISIS15CHARACT" "Power") + ( + Connect("C3-2") + Connect("R3-2") + Connect("U1-16") + ) + Net("THISISAREALLYLONGNETNAMEITS60CHARACTERSLONG>>>>>>>>>>>>>>>>>" "(unknown)") + ( + Connect("C2-2") + Connect("R4-1") + Connect("U1-5") + Connect("U2-3") + ) +) diff --git a/tests/tests.list b/tests/tests.list index 6c8f85d..1a10b4f 100644 --- a/tests/tests.list +++ b/tests/tests.list @@ -179,3 +179,16 @@ hid_png2 | gerber_oneline.pcb | png | --outfile myfile.png | | png:myfile.png hid_png3 | gerber_oneline.pcb | png | --dpi 600 | | png:gerber_oneline.png # +###################################################################### +# --------------------------------------------- +# IPC-D-356 export HID +# --------------------------------------------- +###################################################################### +# +# options: +# --netlist-file Name of output file (If "ipcd356_test.ipc" then the time Stamp is omitted so that the compare can be done without error. +# +# Generates an IPC-D-356 Netlist +# +hid_ipcd356 | ipcd356.pcb | IPC-D-356 | --netlist-file ipcd356_test.ipc | | bom:ipcd356_test.ipc +# -- 1.7.3.4