From e29e59cef3ec7749ed204a079d59c3079e4703f5 Mon Sep 17 00:00:00 2001 From: Stephen Ecob Date: Fri, 26 Nov 2010 19:57:24 +1100 Subject: [PATCH] Added ability to optimise for minimum number of vias instead of minimum effective track length. --- src/action.c | 194 ++++++++++++++++++++++++------------------------------ src/const.h | 3 +- src/flags.c | 1 + src/gpcb-menu.res | 3 +- src/pcb-menu.res | 3 +- src/strflags.c | 1 + 6 files changed, 93 insertions(+), 112 deletions(-) diff --git a/src/action.c b/src/action.c index 8c82d48e..11eb7c47 100644 --- a/src/action.c +++ b/src/action.c @@ -204,6 +204,7 @@ typedef enum F_ToggleDisable2008, F_ToggleDisable2009, F_ToggleHighEffort, + F_ToggleMinVias, F_ToggleUniqueNames, F_Via, F_ViaByName, @@ -439,6 +440,7 @@ static FunctionType Functions[] = { {"ToggleDisable2008", F_ToggleDisable2008}, {"ToggleDisable2009", F_ToggleDisable2009}, {"ToggleHighEffort", F_ToggleHighEffort}, + {"ToggleMinVias", F_ToggleMinVias}, {"ToggleLocalRef", F_ToggleLocalRef}, {"ToggleOrthoMove", F_ToggleOrthoMove}, {"ToggleShowDRC", F_ToggleShowDRC}, @@ -2529,7 +2531,7 @@ static const char display_syntax[] = "Display(ToggleMask|ToggleName|ToggleClearLine|ToggleFullPoly|ToggleSnapPin)\n" "Display(ToggleThindraw|ToggleThindrawPoly|ToggleOrthoMove|ToggleLocalRef)\n" "Display(ToggleCheckPlanes|ToggleDisable2008|ToggleDisable2009)\n" - "Display(ToggleHighEffort|ToggleShowDRC|ToggleAutoDRC)\n" + "Display(ToggleMinVias|ToggleHighEffort|ToggleShowDRC|ToggleAutoDRC)\n" "Display(ToggleLiveRoute|LockNames|OnlyNames)\n" "Display(Pinout|PinOrPadName)\n" "Display(Scroll, Direction)"; @@ -2620,6 +2622,12 @@ If set, the autorouter repeatedly tries to route the board. A slightly varied cost weighting is used each time, to generate varied results. The best result generated is kept. +@item ToggleMinVias +The High Effort (HE) autorouting hack always seeks to minimise the number +of unrouted traces as its first priority. This toggle controls HE's second +priority: if set, HE seeks to minimise the number of vias ahead of minimising +length. + @item ToggleOrthoMove If set, the crosshair is only allowed to move orthogonally from its previous position. I.e. you can move an element or line up, down, @@ -2839,6 +2847,10 @@ ActionDisplay (int argc, char **argv, int childX, int childY) TOGGLE_FLAG (HIGHEFFORTFLAG, PCB); break; + case F_ToggleMinVias: + TOGGLE_FLAG (MINVIASFLAG, PCB); + break; + case F_ToggleOrthoMove: TOGGLE_FLAG (ORTHOMOVEFLAG, PCB); break; @@ -3975,6 +3987,34 @@ ActionAutoPlaceSelected (int argc, char **argv, int x, int y) } /* --------------------------------------------------------------------------- */ +static bool Better (RoutingResult *l, RoutingResult *r) +{ + if (l->NetsRouted > r->NetsRouted) + return true; + if (l->NetsRouted < r->NetsRouted) + return false; + if (TEST_FLAG(MINVIASFLAG, PCB)) + { + if (l->Vias == r->Vias) + return (l->Length < r->Length); + return (l->Vias < r->Vias); + } + return (l->Length < r->Length); +} + +static void showit (void) +{ + DeleteRats (false /*all rats */ ); + AddAllRats (false /*all rats */ , NULL); + ClearAndRedrawOutput (); +} + +static void report (int year, char *tweak, RoutingResult *rr, bool bestyet) +{ + printf (bestyet ? "%d%s best yet: " : "%d%s routed ", year, tweak); + printf ("%d nets using %d vias and Leff=%f\"\n", rr->NetsRouted, rr->Vias, + rr->Length); +} static const char autoroute_syntax[] = "AutoRoute(AllRats|SelectedRats)"; @@ -4086,31 +4126,21 @@ ActionAutoRoute (int argc, char **argv, int x, int y) AutoRoute2008 (selected, &rr2008, tweak2008, true); strcpy (ins, "-2008.pcb"); SavePCB (copy); - if - ( - (rr.NetsRouted < rr2008.NetsRouted) - || - ( - (rr.NetsRouted == rr2008.NetsRouted) - && - (rr.Length > rr2008.Length) - ) - ) - { - Message ("Keeping results from AutoRoute2008()\n"); - } + if (Better(&rr2008, &rr)) + Message ("Keeping results from AutoRoute2008()\n"); else - { - Message ("Keeping results from AutoRoute()\n"); - strcpy (ins, "-New.pcb"); - ReloadPCB (copy); - } + { + Message ("Keeping results from AutoRoute()\n"); + strcpy (ins, "-New.pcb"); + ReloadPCB (copy); + } goto done; } else { nicest.NetsRouted = 0; nicest.Length = 1.0e9; + nicest.Vias = 1.0e9; memset(tried, false, sizeof(tried)); memset(tried2008, false, sizeof(tried2008)); srand (time (NULL)); @@ -4119,61 +4149,47 @@ bigloop: if (use2008) { preferred = 2008; - AutoRoute2008 (selected, &rrwork, tweak2008, true); + AutoRoute2008 (selected, &rrwork, tweak2008, false); TRIED2008(tweak2008) = true; if (i == 0) { sprintf (ins, "-2008%s.pcb", tweak2008); SavePCB (copy); } - printf("2008%s routed %d nets and %f\".\n", tweak2008, - rrwork.NetsRouted, rrwork.Length); + report (2008, tweak2008, &rrwork, false); + if (Better(&rrwork, &nicest)) + { + preferred = 2008; + nicest.NetsRouted = rrwork.NetsRouted; + nicest.Length = rrwork.Length; + nicest.Vias = rrwork.Vias; + showit (); + } strcpy (ins, "-pre.pcb"); ReloadPCB (copy); - if - ( - (rrwork.NetsRouted > nicest.NetsRouted) - || - ( - (rrwork.NetsRouted == nicest.NetsRouted) - && - (rrwork.Length < nicest.Length) - ) - ) - { - preferred = 2008; - nicest.NetsRouted = rrwork.NetsRouted; - nicest.Length = rrwork.Length; - } } if (use2009) { - AutoRoute (selected, &rrwork, tweak, true); + AutoRoute (selected, &rrwork, tweak, false); TRIED(tweak) = true; if (i == 0) { sprintf (ins, "-2009%s.pcb", tweak); SavePCB (copy); } - printf("2009%s routed %d nets and %f\".\n", tweak, - rrwork.NetsRouted, rrwork.Length); + if (Better(&rrwork, &nicest)) + { + preferred = 2009; + nicest.NetsRouted = rrwork.NetsRouted; + nicest.Length = rrwork.Length; + nicest.Vias = rrwork.Vias; + showit (); + report (2009, tweak, &rrwork, true); + } + else + report (2009, tweak, &rrwork, false); strcpy (ins, "-pre.pcb"); ReloadPCB (copy); - if - ( - (rrwork.NetsRouted > nicest.NetsRouted) - || - ( - (rrwork.NetsRouted == nicest.NetsRouted) - && - (rrwork.Length < nicest.Length) - ) - ) - { - preferred = 2009; - nicest.NetsRouted = rrwork.NetsRouted; - nicest.Length = rrwork.Length; - } } for (m = 0; m < 7; ++m) { @@ -4183,8 +4199,10 @@ bigloop: good2008 = 'x'; rr.NetsRouted = 0; rr.Length = 1.0e9; + rr.Vias = 1.0e9; rr2008.NetsRouted = 0; rr2008.Length = 1.0e9; + rr2008.Vias = 1.0e9; for (n = 0; n < 11; ++n) { tweak[ix] = 'A' + n; @@ -4193,47 +4211,26 @@ bigloop: { AutoRoute2008 (selected, &rrwork, tweak2008, false); TRIED2008(tweak2008) = true; - if - ( - (rr2008.NetsRouted < rrwork.NetsRouted) - || - ( - (rr2008.NetsRouted == rrwork.NetsRouted) - && - (rr2008.Length > rrwork.Length) - ) - ) + if (Better(&rrwork, &rr2008)) { good2008 = tweak2008[ix2008]; rr2008.NetsRouted = rrwork.NetsRouted; rr2008.Length = rrwork.Length; } - if - ( - (nicest.NetsRouted < rrwork.NetsRouted) - || - ( - (nicest.NetsRouted == rrwork.NetsRouted) - && - (nicest.Length > rrwork.Length) - ) - ) + if (Better(&rrwork, &nicest)) { preferred = 2008; strcpy(vnice, tweak2008); nicest.NetsRouted = rrwork.NetsRouted; nicest.Length = rrwork.Length; + nicest.Vias = rrwork.Vias; sprintf (ins, "-2008%s.pcb", vnice); SavePCB (copy); - printf("2008%s best yet with %d nets and %f\".\n", - tweak2008, nicest.NetsRouted, nicest.Length); - DeleteRats (false /*all rats */ ); - AddAllRats (false /*all rats */ , NULL); - ClearAndRedrawOutput (); + report (2008, tweak2008, &nicest, true); + showit (); } else - printf("2008%s %d nets and %f\".\n", - tweak2008, rrwork.NetsRouted, rrwork.Length); + report (2008, tweak2008, &rrwork, false); strcpy (ins, "-pre.pcb"); ReloadPCB (copy); } @@ -4241,47 +4238,26 @@ bigloop: { AutoRoute (selected, &rrwork, tweak, false); TRIED(tweak) = true; - if - ( - (rr.NetsRouted < rrwork.NetsRouted) - || - ( - (rr.NetsRouted == rrwork.NetsRouted) - && - (rr.Length > rrwork.Length) - ) - ) + if (Better(&rrwork, &rr)) { good = tweak[ix]; rr.NetsRouted = rrwork.NetsRouted; rr.Length = rrwork.Length; } - if - ( - (nicest.NetsRouted < rrwork.NetsRouted) - || - ( - (nicest.NetsRouted == rrwork.NetsRouted) - && - (nicest.Length > rrwork.Length) - ) - ) + if (Better(&rrwork, &nicest)) { preferred = 2009; strcpy(vnice, tweak); nicest.NetsRouted = rrwork.NetsRouted; nicest.Length = rrwork.Length; + nicest.Vias = rrwork.Vias; sprintf (ins, "-2009%s.pcb", vnice); SavePCB (copy); - printf("2009%s best yet with %d nets and %f\".\n", - tweak, nicest.NetsRouted, nicest.Length); - DeleteRats (false /*all rats */ ); - AddAllRats (false /*all rats */ , NULL); - ClearAndRedrawOutput (); + report (2009, tweak, &nicest, true); + showit (); } else - printf("2009%s %d nets and %f\".\n", - tweak, rrwork.NetsRouted, rrwork.Length); + report (2009, tweak, &rrwork, false); strcpy (ins, "-pre.pcb"); ReloadPCB (copy); } diff --git a/src/const.h b/src/const.h index 033d0ebd..b0158745 100644 --- a/src/const.h +++ b/src/const.h @@ -270,7 +270,7 @@ When set, autorouter high effort is enabled. @end table %end-doc */ -#define PCB_FLAGS 0x01ffffff /* all used flags */ +#define PCB_FLAGS 0x03ffffff /* all used flags */ #define SHOWNUMBERFLAG 0x00000001 #define LOCALREFFLAG 0x00000002 @@ -297,6 +297,7 @@ When set, autorouter high effort is enabled. #define DISABLE2008FLAG 0x00400000 #define DISABLE2009FLAG 0x00800000 #define HIGHEFFORTFLAG 0x01000000 +#define MINVIASFLAG 0x02000000 /* --------------------------------------------------------------------------- * object types diff --git a/src/flags.c b/src/flags.c index dc1c5dc7..e1e1eb7c 100644 --- a/src/flags.c +++ b/src/flags.c @@ -207,6 +207,7 @@ HID_Flag flags_flag_list[] = { {"disable2008", FlagTESTFLAG, DISABLE2008FLAG}, {"disable2009", FlagTESTFLAG, DISABLE2009FLAG}, {"higheffort", FlagTESTFLAG, HIGHEFFORTFLAG}, + {"minimisevias", FlagTESTFLAG, MINVIASFLAG}, {"showdrc", FlagTESTFLAG, SHOWDRCFLAG}, {"rubberband", FlagTESTFLAG, RUBBERBANDFLAG}, {"description", FlagTESTFLAG, DESCRIPTIONFLAG}, diff --git a/src/gpcb-menu.res b/src/gpcb-menu.res index 11ce2817..e74ae629 100644 --- a/src/gpcb-menu.res +++ b/src/gpcb-menu.res @@ -218,7 +218,8 @@ MainMenu = - {"Disable 2008 autorouter" checked=disable2008 Display(ToggleDisable2008)} {"Disable default autorouter" checked=disable2009 Display(ToggleDisable2009)} - {"Autorouter high effort" checked=higheffort Display(ToggleHighEffort)} + {"Autorouter High Effort (HE)" checked=higheffort Display(ToggleHighEffort)} + {"Minimise vias (not length) in HE" checked=minimisevias Display(ToggleMinVias)} - {"Vendor drill mapping" ToggleVendor() checked=VendorMapOn} {"Import Settings" diff --git a/src/pcb-menu.res b/src/pcb-menu.res index 60339755..bbcb9d1d 100644 --- a/src/pcb-menu.res +++ b/src/pcb-menu.res @@ -211,7 +211,8 @@ MainMenu = - {"Disable 2008 autorouter" checked=disable2008 Display(ToggleDisable2008)} {"Disable default autorouter" checked=disable2009 Display(ToggleDisable2009)} - {"Autorouter high effort" checked=higheffort Display(ToggleHighEffort)} + {"Autorouter High Effort (HE)" checked=higheffort Display(ToggleHighEffort)} + {"Minimise vias (not length) in HE" checked=minimisevias Display(ToggleMinVias)} - {"Pinout shows number" checked=shownumber Display(ToggleName)} {"Pins/Via show Name/Number" Display(PinOrPadName) a={"D" "d"}} diff --git a/src/strflags.c b/src/strflags.c index 68f9a3e2..662d8f71 100644 --- a/src/strflags.c +++ b/src/strflags.c @@ -121,6 +121,7 @@ static FlagBitsType pcb_flagbits[] = { { DISABLE2008FLAG, N ("disable2008"), 1 }, { DISABLE2009FLAG, N ("disable2009"), 1 }, { HIGHEFFORTFLAG, N ("higheffort"), 1 }, + { MINVIASFLAG, N ("minimisevias"), 1 }, { SHOWDRCFLAG, N ("showdrc"), 1 }, { RUBBERBANDFLAG, N ("rubberband"), 1 }, { DESCRIPTIONFLAG, N ("description"), 1 }, -- 2.11.4.GIT