Combinazione di routing manuale e routing automatico in Eagle; Ripup selettivo in un ULP Eagle


8

In Eagle preferisco spesso instradare alcuni fili da solo (alimentazione, xtal, UBS, ecc.) E lasciare il resto all'autorouter. Quando non sono soddisfatto del risultato, instrado un po 'di più me stesso e lascio che l'autorouter faccia un altro tentativo.

Il mio problema è annullare il lavoro dell'autorouter, senza annullare il mio lavoro. Il modo di base per farlo è semplicemente non salvare la versione autorouterata e quindi caricare nuovamente la scheda. Ma una volta commesso l'errore di salvare la versione autorouted (e di eliminare i backup), voglio ancora poter tornare alla versione pre-autorouted.

Un tentativo per farlo è quello di identificare tutti i fili autorouted in un ULP e creare la stringa di comando per eseguire il RIPUP di questi segmenti. Posso fare in modo che l'ULP identifichi i fili autorouiti, ad esempio assegnando loro una larghezza diversa. Ma il comando RIPUP sembra rippare il segmento di filo selezionato E SEGMENTI DI REGOLAZIONE. Finora non ho trovato un comando che strappa solo il segmento di filo selezionato.

Quindi immagino di avere due domande: - Come combinare il routing manuale e il routing automatico in modo iterativo (prova ed errore)? - C'è un modo (probabilmente usando ULP e comandi) per rippare un sottoinsieme di segmenti di filo?

(aggiornamento) Ho provato l'approccio opposto: in un ULP, raccogli tutti i segmenti di filo che voglio mantenere, eseguo un ripup completo, quindi ripristina i segmenti di filo (usando il comando ROUTE). Nessun successo, i segmenti devono essere in un ordine specifico per i comandi di rotta (non nell'ordine in cui l'ULP li trova :(), la via deve essere fatta per prima e alcuni altri problemi.

GRRRR, deve esserci un modo semplice per farlo, o sono eccessivamente ottimista?


Se il file di dati di Eagle segue lo stesso approccio di quelli con cui ho giocato (ad es. Il vecchio DOS Autotrax), ogni segmento di traccia ha una linea a sé. Se le larghezze delle tracce sono uniche, [tm] dovrebbe essere facile identificare i segmenti delle tracce ed eliminare le linee interessate. La memoria fioca mi dice che a un certo punto ho scritto una routine per identificare le etichette dei componenti e ridimensionarle, ruotarle e spostarle rispetto al corpo del componente. L'identificazione della traccia sembra facile rispetto. Salva una copia prima di eseguire il programma !!! :-).
Russell McMahon,

questa è una domanda formidabile, potrei suggerirti di pubblicarlo anche sull'esperto Element14 su Eagle element14.com/community/message/5177 . Se lo fai e trovi qualcosa, ti preghiamo di postare di nuovo qui!
Vicatcu,

Ok fatto. Se fallisce, posso provare i forum dell'aquila.
Wouter van Ooijen,

Risposte:


4

Odio rispondere alla mia domanda, ma eccomi qui. Spero di non ottenere punti per la risposta, sarebbe strano, solo per aver accettato una risposta? (A proposito, non ho ricevuto alcuna risposta sul forum Element14.)

La soluzione è utilizzare il comando DRAW, non ROUTE. DRAW posizionerà un segmento di filo, esattamente dove si specifica (diversamente da ROUTE, che tenta di connettersi a un airwire non instradato. ROUTE è essenzialmente inutile in uno script.). Il prossimo problema è via: non riesco (o non voglio) distinguere tra un manuale via e un via automatica, quindi tengo tutti i via che collegano due (o più) segmenti di filo manuali. Altri via vengono eliminati.

Quindi quello che fa la mia sceneggiatura finale è:

prepare a ripup command
for all copper segments that are not 0.01 wide (the width I use for autorouting)
   check both endpoints for a via at that location
      prepare the via to be resurrected when it is visited the 2nd time
   prepare a command that resurrects the copper segment
execute the prepared commands

Si noti che probabilmente non funzionerà per più di due strati, né per altre cose oltre ai segmenti di filo sullo strato di rame.

IMHO l'intero concetto dell'aquila ULP e dei linguaggi di comando è problematico. Un ULP funziona in un ambiente di sola lettura, l'unico modo in cui può influenzare il circuito, la scheda o la libreria è creando un elenco di comandi. Questo elimina alcune utili tecniche di programmazione, ma peggio ancora è che i comandi non sono stati progettati per essere facilmente creati da un ULP. Sono necessari tutti i tipi di trasformazioni (in questo caso: coordinate, nomi delle forme) per tradurre dal mondo ULP al mondo CMD.

(modifica) Prima di eseguire questo ULP, impostare la selezione 'piega filo' per consentire angoli arbitrari, altrimenti l'aquila proverà ad adattare i fili risorti agli angoli consentiti, il che può provocare un casino sanguinante. IMHO questo è un altro esempio del problema con ULP / SCR.

Questo è il codice ULP:

// gather the commands that must be run on exit
string RunOnExit = "";
void cmd( string s ) { RunOnExit += s + "\n"; }

// return an x or y position in the form that can be used in a command
real f( int x ){
   board( B ) switch( B.grid.unit ) {
      case 0: return u2mic(x);
      case 1: return u2mm(x);
      case 2: return u2mil(x);
      case 3: return u2inch(x);
   }
}   

// return the string form of the a via's shape
string sn( int x ){
   if( x == VIA_SHAPE_SQUARE )  return "square";
   if( x == VIA_SHAPE_ROUND )   return "round";
   if( x == VIA_SHAPE_OCTAGON   ) return "octagon";
   if( x == VIA_SHAPE_ANNULUS   ) return "annulus";
   if( x == VIA_SHAPE_THERMAL   ) return "thermal";
   return "unknown-via-shape";
}

// count the number of times x occurs in s
int n_ocurrences( string s, string x ){
   int i, n = 0;
   while( 1 ){
      i = strstr( s, x );
      if( i == -1 ) return n;
      s = strsub( s, i + strlen( x ));
      n++;
   }
}

// add a via, but only when it is visited the second time
string via_list = "";
void add_via( int a, int b ){

   // for all via's
   board( B ) B.signals( S ) S.vias( V ){

      // if the via is at the current location
      if(( V.x == a ) && ( V.y == b )){
         string s, coo;

         // the coordinates of the via are used as its identification
         sprintf( coo, "(%.6f %.6f)", f( V.x ), f( V.y ));         

         // if this is the second visit to this via
         via_list += coo;
         if( n_ocurrences( via_list, coo ) == 2 ){

            // resurrect this via
            sprintf( s, "VIA '%s' %f %s %s;", 
            S.name, f( V.drill ), sn( V.shape[ 1 ] ), coo );
            cmd( s );      
         }
      }
   }         
}

if( !board ){
   dlgMessageBox("start this ULP in Board", "OK");
   exit( 0 );
}

board( B ){ 

   // first delete all coper segments, 
   // later we will resurrect what we want to keep 
   cmd( "RIPUP;" );

   // for all wire segments in the top and bottom copper layers
   B.signals(S) S.wires(W) {
      if( ( W.layer == 1 ) || ( W.layer == 16 ) ){ 

         // that are not 0.01 width (that is what the autorouter uses)
         if( f( W.width ) != 0.01 ){
            string s;

            // resurrect via's adjacent to this wire segment
            add_via( W.x1, W.y1 );
            add_via( W.x2, W.y2 );

            sprintf( s, "CHANGE LAYER %d;", W.layer );
            cmd( s );      

            // resurrect this wire segment                 
            sprintf( 
               s, "WIRE '%s' %f (%.6f %.6f) (%.6f %.6f);", 
               S.name, f( W.width),
               f(W.x1), f(W.y1), f(W.x2), f(W.y2));
            cmd( s );   
         }   
      }
   }
   // dlgMessageBox( RunOnExit, "OK");
   exit( RunOnExit );
}

Eagle ULP / SCR sono una delle sue caratteristiche più potenti. Come hai scoperto, gli ULP vengono utilizzati per interrogare la scheda e scrivere script che possono essere assolutamente qualsiasi cosa tu possa fare da solo. Questo è il suo potere. Detto questo, vorrei che fosse in un linguaggio "normale", forse Python o persino Lua, ma anche tu devi ammettere che essere in grado di fare qualcosa a cui gli autori del software non hanno pensato sia una bella sensazione.
akohlsmith,

Certo, ma il loro potere deve essere esercitato in modo arcano: gli ULP sono potenti, ma non possono cambiare lo schema / bordo, SCR è una variante paralizzata della GUI. Insieme possono fare un lavoro utile, ma le cose avrebbero potuto essere molto più facili! E per il mio problema particolare sarebbe stato bello se le cose aggiunte dall'autorouter fossero in qualche modo identificabili.
Wouter van Ooijen,

2
In EAGLE v6.3, il comando è WIRE non DRAW (non esiste un comando DRAW).

2

Wouter. Non ho visto la tua domanda prima perché ero alla Masters la scorsa settimana.

Il modo in cui mi occupo di questo è di salvare una copia della scheda con un nome diverso prima di eseguire l'autorouter. Lo chiamo sempre SAVE.BRD, che può essere eliminato in modo sicuro una volta fatto.

Il mio flusso di lavoro di routing sembra essere molto simile al tuo. Instrado manualmente le parti critiche, assicurando che le classi di rete siano impostate ragionevolmente, quindi eseguo l'autorouter. Quindi cerco problemi come dove l'autorouter non è riuscito a trovare una soluzione, ha finito per fare qualcosa di scomodo, ecc. Torno alla versione salvata (prima dell'autoroute), spero di apportare alcune modifiche manuali sperando che l'autorouter non ottenga nei guai, quindi riprovare. Questo potrebbe essere ripetuto 5-10 volte, a seconda della complessità della scheda. I primi passaggi dell'autoroute sono principalmente per vedere se c'è una soluzione e approssimativamente per trovare i punti problematici. Per questo non uso nemmeno passaggi di ottimizzazione. Le autoroute successive sono con ottimizzazione completa, che per me di solito è di 8 passaggi con costi che cambiano su tali passaggi per ottenere le caratteristiche che desidero.

Anche se eseguo un salvataggio su SAVE.BRD prima di ogni passaggio dell'autoroute (e quindi riapro il file originale per procedere con quello), provo a non salvare il risultato autorouted fino a quando non sono soddisfatto di tutto. Salvare l'istantanea su SAVE.BRD ogni volta è un backup di sicurezza nel caso in cui le mie dita accidentalmente facciano un salvataggio prima di pensarci.

Sarebbe bello se Eagle avesse un'opzione ripup per l'ultimo passaggio dell'autoroute, ma non esiste nulla del genere.


La tua disciplina lavorerà per una persona che è sempre disciplinata. Potresti indovinare che non lo sono. Una volta ho eseguito l'autorouting, quindi ho apportato alcune modifiche al circuito, quindi ho eliminato il brd e ho provato a tornare alla versione pre-autorouted. Non è una buona idea ... Quindi ora ho più o meno un modo per annullare l'autoroute, a condizione che io possa distinguere le tracce autorouted per larghezza. Sarebbe bello se le tracce autorouted avessero qualche attributo che le identificasse come tali.
Wouter van Ooijen,

Strano, avevo scritto "Ciao, Wouter" all'inizio del mio post, ma la parte "Ciao" sembra essere stata cancellata.
Olin Lathrop,

Credo che sia una "caratteristica" che ha lo scambio di stack. Pensano che dire "Ciao" all'inizio di un post non sia necessario e dovrebbero essere rimossi per mantenere le cose "pulite". Simile a loro che toglie @username in alcuni casi ... e proprio come in questo caso in cui non ho potuto digitare @ Olin (senza spazio) e @ username nello stesso commento.
Kellenjb,


1

Se il file di dati di Eagle segue lo stesso approccio di quelli con cui ho giocato (ad es. Il vecchio DOS Autotrax), ogni segmento di traccia ha una linea a sé. Le linee sono "autonome" e possono essere modificate o eliminate senza alcun impatto su altro. I sistemi "migliori" più recenti potrebbero non avere una semplicità così potente.

Se le tracce sono indipendenti, come sopra, e se le larghezze delle tracce sono uniche, [tm] dovrebbe essere facile identificare i segmenti delle tracce ed eliminare le linee interessate.

La memoria fioca mi dice che a un certo punto ho scritto una routine per identificare le etichette dei componenti e ridimensionarle, ruotarle e spostarle rispetto al corpo del componente. L'identificazione della traccia sembra facile rispetto. Salva una copia prima di eseguire il programma !!! :-).


Di quale formato di file stai parlando? Il file .brd eagle non è un file di testo. Il mio problema con i segmenti di traccia non è che non riesco a identificarli, ma che l'unico comando di cui sono a conoscenza che posso usare farà troppo: RIPUP strappa non solo il segmento ma anche (alcuni) segmenti adiacenti.
Wouter van Ooijen,

@Wouter van Ouijen - YMMV :-). Non essere di per sé testo non significa che non può essere hackerato, ma potrebbe esserlo. Non so come sia il file .brd di Eagle all'interno e non so se è possibile strappare interi segmenti di traccia e concatenare il resto in modo sicuro, probabilmente no. Vale la pena dare un'occhiata però. Potresti essere in grado di scrivere un lettore e riscrittore di file che ricostruisce in modo intelligente il file meno le parti indesiderate. Dipenderebbe da quanto sia noto o conoscibile il formato del file.
Russell McMahon,

Mi rendo conto che al momento della stesura della domanda questo era vero, ma i formati di file di Eagle ora sono semplici file di testo XML.
akohlsmith,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.