Menggabungkan perutean tangan dan perutean otomatis di Eagle; ripup selektif dalam Eagle ULP

8

Dalam Eagle saya sering memilih untuk merutekan beberapa kabel sendiri (power, xtal, UBS, dll), dan menyerahkan sisanya ke autorouter. Ketika saya tidak puas dengan hasilnya, saya akan melakukan beberapa rute sendiri, dan biarkan autorouter mencoba lagi.

Masalah saya adalah membatalkan pekerjaan autorouter, tanpa membatalkan pekerjaan saya sendiri. Cara dasar untuk melakukan ini adalah tidak menyimpan versi autoroutered, dan kemudian memuat papan lagi. Tetapi begitu saya membuat kesalahan dengan menyimpan versi yang di-autorout (dan membersihkan backup) saya masih ingin dapat kembali ke versi yang sebelumnya di-autorout.

Salah satu upaya untuk melakukan ini adalah mengidentifikasi semua kabel autorouted di ULP dan membuat string perintah untuk RIPUP segmen ini. Saya dapat mengatur ULP untuk mengidentifikasi kabel autorouted, misalnya dengan memberi mereka lebar yang berbeda. Tetapi perintah RIPUP tampaknya ripup segmen kawat yang dipilih DAN SEGMEN ADJACEN. Sejauh ini saya belum menemukan perintah yang hanya merobek segmen kawat yang dipilih.

Jadi saya kira saya punya dua pertanyaan: - Bagaimana Anda menggabungkan hand-routing dan auto-routing dalam cara yang berulang (trial-and-error)? - Apakah ada cara (mungkin menggunakan ULP dan perintah) untuk ripup subset segmen kawat?

(pembaruan) Saya mencoba pendekatan yang berlawanan: dalam ULP, kumpulkan semua segmen kawat yang ingin saya simpan, lakukan ripup penuh, dan kemudian kembalikan segmen kabel (menggunakan perintah ROUTE). Tidak berhasil, segmen harus dalam urutan tertentu untuk perintah rute (bukan urutan tempat ULP menemukannya :(), via harus dibuat terlebih dahulu, dan beberapa masalah lagi.

GRRRR, pasti ada cara mudah untuk melakukan ini, atau apakah saya terlalu optimis?

Wouter van Ooijen
sumber
Jika file data Eagle mengikuti pendekatan yang sama dengan yang lama yang saya mainkan (mis. Anda yang lebih tua DOS Autotrax) maka setiap segmen trek memiliki garis untuk dirinya sendiri. Jika lebar lintasan unik, seharusnya [tm] mudah untuk mengidentifikasi segmen trek dan menghapus garis yang bersangkutan. Memori redup memberi tahu saya bahwa pada satu tahap saya menulis rutin untuk mengidentifikasi label komponen dan mengubah ukuran, memutar dan memindahkannya relatif ke badan komponen. Identifikasi trek terdengar mudah dibandingkan. Simpan salinan sebelum menjalankan program !!! :-).
Russell McMahon
ini adalah pertanyaan yang hebat, mungkin saya sarankan Anda juga mempostingnya ke pakar Element14 pada Eagle element14.com/community/message/5177 . Jika Anda menemukan dan menemukan sesuatu, silakan kirim kembali ke sini!
vicatcu
OK selesai. Jika gagal, saya dapat mencoba forum elang.
Wouter van Ooijen

Jawaban:

4

Saya benci menjawab pertanyaan saya sendiri, tetapi ini dia. Saya harap saya tidak mendapatkan poin untuk menjawab, itu akan aneh, hanya karena menerima jawaban? (BTW, saya tidak mendapat jawaban di forum Element14.)

Solusinya adalah dengan menggunakan perintah DRAW, bukan ROUTE. DRAW akan menempatkan segmen kawat, tepat di tempat yang Anda tentukan (tidak seperti ROUTE, yang mencoba menyambung ke airwire yang tidak diretas. ROUTE pada dasarnya tidak berguna dalam skrip.). Masalah berikutnya adalah via: Saya tidak bisa (atau tidak mau) membedakan antara manual via dan autorouted via, jadi saya menyimpan semua via yang menghubungkan dua (atau lebih) segmen kawat manual. Via via lainnya dihapus.

Jadi yang dilakukan skrip terakhir saya adalah:

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

Perhatikan bahwa itu mungkin tidak akan berfungsi lebih dari dua lapisan, atau untuk hal lain selain segmen kawat pada lapisan tembaga.

IMHO seluruh konsep ULP elang dan bahasa perintah merepotkan. ULP berjalan dalam lingkungan baca-saja, satu-satunya cara itu dapat mempengaruhi sirkuit, papan atau pustaka adalah dengan membuat daftar perintah. Ini menghilangkan beberapa teknik pemrograman yang berguna, tetapi yang lebih buruk adalah bahwa perintah tidak dirancang agar mudah dibuat dari ULP. Anda memerlukan semua jenis transformasi (dalam hal ini: koordinat, nama bentuk) untuk menerjemahkan dari dunia ULP ke dunia CMD.

(sunting) Sebelum Anda menjalankan ULP ini, setel pilihan 'bengkokan kawat' untuk memungkinkan sudut yang berubah-ubah, jika tidak elang akan mencoba menyesuaikan kabel yang dibangkitkan dengan sudut yang dibolehkan, yang dapat mengakibatkan kekacauan berdarah. IMHO ini adalah contoh lain masalah dengan ULP / SCR.

Ini adalah kode 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 );
}
Wouter van Ooijen
sumber
Eagle's ULP / SCR adalah salah satu fitur yang paling kuat. Seperti yang telah Anda temukan, ULP digunakan untuk menanyakan papan tulis dan menulis skrip yang bisa menjadi apa saja yang dapat Anda lakukan sendiri. Itu kekuatannya. Setelah mengatakan bahwa saya berharap bahwa itu dalam bahasa yang 'normal', mungkin Python atau bahkan Lua, tetapi bahkan Anda harus mengakui bahwa mampu melakukan sesuatu yang tidak terpikirkan oleh penulis perangkat lunak adalah perasaan yang baik.
akohlsmith
Tentu, tetapi kekuatan mereka harus dipegang dengan cara yang misterius: ULP kuat, tetapi tidak dapat mengubah skematis / bord, SCR adalah variasi GUI yang lumpuh. Bersama-sama mereka dapat melakukan pekerjaan yang bermanfaat, tetapi banyak hal bisa menjadi lebih mudah! Dan untuk masalah khusus saya, alangkah baiknya jika hal-hal yang ditambahkan oleh autorouter dapat diidentifikasi.
Wouter van Ooijen
2
Dalam EAGLE v6.3, perintahnya adalah WIRE bukan DRAW (tidak ada perintah DRAW).
2

Wouter. Saya tidak melihat pertanyaan Anda sebelumnya karena saya di Masters minggu lalu.

Cara saya menangani ini adalah dengan menyimpan salinan papan ke nama yang berbeda tepat sebelum menjalankan autorouter. Saya selalu menamainya SAVE.BRD, yang bisa dihapus dengan aman begitu semuanya selesai.

Alur kerja perutean saya tampaknya sangat mirip milik Anda. Saya merutekan bagian-bagian penting secara manual, memastikan kelas-kelas jaring diatur secara wajar, kemudian jalankan autorouter. Lalu saya mencari masalah seperti di mana autorouter tidak dapat menemukan solusi, itu akhirnya melakukan sesuatu yang tidak nyaman, dll. Saya kembali ke versi yang disimpan (sebelum autoroute) membuat beberapa perubahan manual semoga sehingga autorouter tidak akan mendapatkan dalam masalah, lalu coba lagi. Ini mungkin diulang 5-10 kali, tergantung pada kompleksitas papan. Beberapa pass autoroute pertama sebagian besar untuk melihat apakah ada solusi dan kira-kira untuk menemukan titik masalah. Untuk itu saya bahkan tidak menggunakan pass optimasi. Autoroutes nanti adalah dengan optimasi penuh, yang bagi saya biasanya 8 lintasan dengan biaya berubah atas lintasan untuk mendapatkan karakteristik yang saya inginkan.

Meskipun saya melakukan save to SAVE.BRD sebelum setiap autoroute pass (dan kemudian membuka kembali file asli untuk melanjutkannya), saya mencoba untuk tidak melakukan save pada hasil autorouted sampai saya puas dengan semuanya. Menyimpan snapshot ke SAVE.BRD setiap kali adalah cadangan keselamatan jika jariku secara tidak sengaja melakukan save sebelum saya memikirkannya.

Akan lebih baik jika Eagle memiliki opsi ripup untuk pass autoroute terakhir, tetapi tidak ada hal seperti itu.

Olin Lathrop
sumber
Anda disiplin akan bekerja untuk orang yang selalu disiplin. Anda mungkin menebak bahwa saya tidak. Setelah saya autorouted, kemudian membuat beberapa perubahan pada sirkuit, kemudian menghapus brd dan mencoba untuk beralih kembali ke versi pre-autorouted. Bukan ide yang bagus ... Jadi sekarang saya kurang lebih memiliki cara untuk membatalkan autoroute, asalkan saya dapat membedakan jejak autorouted dengan lebar. Akan lebih baik jika jejak autorouted memiliki beberapa atribut yang mengidentifikasi mereka seperti itu.
Wouter van Ooijen
Aneh, saya telah menulis "Hai, Wouter" di awal posting saya, tetapi bagian "Hai," tampaknya telah dilucuti.
Olin Lathrop
Saya percaya itu adalah "fitur" yang dimiliki pertukaran pertukaran. Mereka berpikir mengatakan "Hai" di awal posting tidak diperlukan dan harus dihapus untuk menjaga hal-hal "bersih". Mirip dengan mereka menanggalkan @namapengguna dalam beberapa kasus ... dan persis seperti ini di mana saya tidak bisa mengetik @Olin (tanpa spasi) dan @namapengguna dalam komentar yang sama.
Kellenjb
1

Jika file data Eagle mengikuti pendekatan yang sama dengan yang lama yang saya mainkan (mis. Anda yang lebih tua DOS Autotrax) maka setiap segmen trek memiliki garis untuk dirinya sendiri. Garis "berdiri sendiri" dan dapat diedit atau dihapus tanpa berdampak pada hal lain. Sistem "lebih baik" yang lebih baru mungkin tidak memiliki kesederhanaan yang begitu kuat.

Jika trek independen, seperti di atas, dan jika lebar trek unik, seharusnya [tm] mudah untuk mengidentifikasi segmen trek dan menghapus garis yang bersangkutan.

Memori redup memberi tahu saya bahwa pada satu tahap saya menulis rutin untuk mengidentifikasi label komponen dan mengubah ukuran, memutar dan memindahkannya relatif ke badan komponen. Identifikasi trek terdengar mudah dibandingkan. Simpan salinan sebelum menjalankan program !!! :-).

Russell McMahon
sumber
Format file apa yang Anda bicarakan? File .brd elang bukan file teks. Masalah saya dengan segmen trek bukanlah bahwa saya tidak dapat mengidentifikasi mereka, tetapi bahwa satu-satunya perintah yang saya tahu dapat saya gunakan akan melakukan terlalu banyak: RIPUP merobek bukan hanya segmen tetapi juga segmen yang berdekatan.
Wouter van Ooijen
@Wouter van Ouijen - YMMV :-). Bukan menjadi teks bukan berarti itu tidak bisa diretas - tetapi mungkin. Saya tidak tahu seperti apa file .brd Eagle terlihat di dalam dan saya tidak tahu apakah Anda dapat merobek seluruh segmen trek dan menyatukan sisanya dengan aman - mungkin tidak. Layak untuk dilihat. Anda mungkin dapat menulis pembaca file dan rewriter yang secara cerdas membangun kembali file kurang bagian yang tidak diinginkan. Itu akan tergantung pada seberapa terkenal atau diketahui format file.
Russell McMahon
Saya menyadari bahwa pada saat menulis pertanyaan ini benar, tetapi format file Eagle sekarang adalah file teks XML langsung.
akohlsmith