Combinando roteamento manual e roteamento automático no Eagle; ripup seletivo em um ULP Eagle

8

Em Eagle, muitas vezes prefiro rotear alguns fios (potência, xtal, UBS, etc.) e deixar o resto para o autorouter. Quando não estou satisfeito com o resultado, roteio um pouco mais e deixo o autorouter tentar outra vez.

Meu problema é desfazer o trabalho do autorouter, sem desfazer o meu próprio trabalho. A maneira básica de fazer isso é simplesmente não salvar a versão autoroutered e, em seguida, carregar a placa novamente. Mas, uma vez que eu cometa o erro de salvar a versão com saída automática (e limpar os backups), ainda quero poder voltar à versão com saída automática.

Uma tentativa de fazer isso é identificar todos os fios com saída automática em um ULP e criar a sequência de comandos para RIPUP esses segmentos. Posso providenciar para que o ULP identifique os fios com saída automática, por exemplo, dando a eles uma largura diferente. Mas o comando RIPUP parece copiar o segmento de fio selecionado E SEGMENTOS ADJACENTES. Até agora, não encontrei um comando que rasgue apenas o segmento de fio selecionado.

Então, acho que tenho duas perguntas: - Como você combina o roteamento manual e o roteamento automático de maneira iterativa (tentativa e erro)? - Existe uma maneira (provavelmente usando ULP e comandos) de copiar um subconjunto de segmentos de fios?

(atualização) Tentei a abordagem oposta: em um ULP, reúna todos os segmentos de fios que quero manter, faça uma ripup completa e restaure os segmentos de fios (usando o comando ROUTE). Sem sucesso, os segmentos devem estar em uma ordem específica para os comandos de rota (não na ordem em que o ULP os encontra :(), as vias devem ser feitas primeiro e mais alguns problemas.

GRRRR, deve haver uma maneira fácil de fazer isso, ou estou excessivamente otimista?

Wouter van Ooijen
fonte
Se o arquivo de dados do Eagle segue a mesma abordagem que os anteriores com os quais eu brinquei (por exemplo, o antigo Autotrax do DOS), cada segmento de faixa tem uma linha para si. Se as larguras das faixas forem únicas, deve ser fácil identificar os segmentos da faixa e excluir as linhas em questão. A memória fraca me diz que, em um estágio, escrevi uma rotina para identificar rótulos de componentes e redimensionar, girar e movê-los em relação ao corpo do componente. A identificação da faixa parece fácil em comparação. Salve uma cópia antes de executar o programa !!! :-).
Russell McMahon
esta é uma pergunta fantástica, sugiro que você também a publique no especialista Element14 em Eagle element14.com/community/message/5177 . Se você faz e encontra alguma coisa, por favor poste aqui!
vicatcu
Feito. Se isso falhar, posso tentar os fóruns da Eagle.
Wouter van Ooijen

Respostas:

4

Eu odeio responder minha própria pergunta, mas aqui vou eu. Espero não receber pontos por responder, isso seria estranho, apenas por aceitar uma resposta? (BTW, não recebi nenhuma resposta no fórum Element14.)

A solução é usar o comando DRAW, não ROUTE. DRAW colocará um segmento de fio, exatamente onde você especificar (ao contrário de ROUTE, que tenta se conectar a um fio aéreo não roteado. ROUTE é essencialmente inútil em um script). A próxima questão é via: não consigo (ou não quero) distinguir entre uma via manual e uma via autorouted, por isso mantenho todas as via que conectam dois (ou mais) segmentos de cabos manuais. Outras via são excluídas.

Então, o que meu script final faz é:

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

Observe que provavelmente não funcionará por mais de duas camadas, nem por outras coisas que não sejam segmentos de fios na camada de cobre.

IMHO todo o conceito da ULP da águia e das linguagens de comando é problemático. Um ULP é executado em um ambiente somente leitura, a única maneira de afetar o circuito, a placa ou a biblioteca é criando uma lista de comandos. Isso elimina algumas técnicas de programação úteis, mas o pior é que os comandos não foram projetados para serem facilmente criados a partir de um ULP. Você precisa de todos os tipos de transformações (neste caso: coordenadas, nomes de formas) para traduzir do mundo ULP para o mundo CMD.

(edit) Antes de executar este ULP, defina a seleção 'wire bend' para permitir ângulos arbitrários; caso contrário, o eagle tentará adaptar os fios ressuscitados aos ângulos permitidos, o que pode resultar em uma confusão sangrenta. IMHO este é outro exemplo do problema com ULP / SCR.

Este é o código 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
fonte
O ULP / SCR da Eagle é um dos seus recursos mais poderosos. Como você descobriu, as ULPs são usadas para consultar o quadro e escrever scripts, que podem ser absolutamente qualquer coisa que você possa fazer sozinho. Esse é o seu poder. Dito isto, eu gostaria que estivesse em uma linguagem 'normal', talvez Python ou até Lua, mas mesmo você deve admitir que ser capaz de fazer algo que os autores do software não pensaram é uma sensação boa.
akohlsmith
Claro, mas seu poder deve ser exercido de uma maneira misteriosa: as ULPs são poderosas, mas não podem mudar o esquema / bord, SCR é uma variação aleijada da GUI. Juntos, eles podem fazer um trabalho útil, mas as coisas poderiam ter sido facilitadas! E para o meu problema em particular, seria bom se as coisas adicionadas pelo autorouter fossem identificadas de alguma forma.
Wouter van Ooijen
2
No EAGLE v6.3, o comando não é WIRE DRAW (não há comando DRAW).
2

Wouter. Não vi sua pergunta mais cedo porque estava no Masters na semana passada.

A maneira como lida com isso é salvar uma cópia do quadro em um nome diferente antes de executar o autorouter. Eu sempre o nomeio SAVE.BRD, que pode ser excluído com segurança quando tudo estiver pronto.

Meu fluxo de trabalho de roteamento parece muito com o seu. Encaminho as partes críticas manualmente, verifique se as classes da rede estão configuradas razoavelmente e, em seguida, execute o autorouter. Depois, procuro problemas como o autorouter não conseguiu encontrar uma solução, acabou fazendo algo inconveniente etc. Volto à versão salva (antes do autoroute), espero que faça algumas alterações manuais para que o autorouter não consiga com problemas e tente novamente. Isso pode ser repetido de 5 a 10 vezes, dependendo da complexidade da placa. As primeiras passagens de auto-rota são principalmente para verificar se há uma solução e aproximadamente para encontrar os pontos problemáticos. Para isso, eu nem uso nenhum passe de otimização. As autoroutes posteriores estão com otimização total, o que para mim geralmente é de 8 passes, com os custos alterando-os para obter as características desejadas.

Mesmo que eu salve o arquivo SAVE.BRD antes de cada passagem automática (e reabra o arquivo original para continuar com isso), tento não salvar o resultado da saída automática até que eu esteja feliz com a coisa toda. Salvar o instantâneo no SAVE.BRD sempre é um backup de segurança, caso meus dedos façam um salvamento acidental antes de pensar nisso.

Seria bom se o Eagle tivesse uma opção de ripup para o último passe de auto-rota, mas não existe.

Olin Lathrop
fonte
Sua disciplina funcionará para uma pessoa que é sempre disciplinada. Você pode imaginar que eu não sou. Depois que eu saí automaticamente, fiz algumas alterações no circuito, excluí o brd e tentei voltar para a versão pré-saida. Não é uma boa ideia ... Portanto, agora eu tenho mais ou menos uma maneira de desautorizar, desde que eu possa distinguir os traços com saída automática por largura. Seria bom se os rastreamentos com saída automática tivessem algum atributo que os identificasse como tal.
Wouter van Ooijen
Estranho, eu escrevi "Oi, Wouter" no começo do meu post, mas a parte "Oi" parece ter sido arrancada.
Olin Lathrop
Eu acredito que esse é um "recurso" que a troca de pilhas possui. Eles acham que dizer "Oi" no início de uma postagem não é necessário e deve ser removido para manter as coisas "limpas". Semelhante a eles retirando o @username em alguns casos ... e assim como neste caso em que eu não poderia digitar @ Olin (sem espaço) e @ username no mesmo comentário.
Kellenjb
1

Se o arquivo de dados do Eagle segue a mesma abordagem que os anteriores com os quais eu brinquei (por exemplo, o antigo Autotrax do DOS), cada segmento de faixa tem uma linha para si. As linhas são "independentes" e podem ser editadas ou excluídas sem afetar nada. Sistemas "melhores" mais recentes podem não ter uma simplicidade tão poderosa.

Se as faixas são independentes, como acima, e se as larguras das faixas são únicas, deve ser fácil identificar os segmentos da faixa e excluir as linhas em questão.

A memória fraca me diz que, em um estágio, escrevi uma rotina para identificar rótulos de componentes e redimensionar, girar e movê-los em relação ao corpo do componente. A identificação da faixa parece fácil em comparação. Salve uma cópia antes de executar o programa !!! :-).

Russell McMahon
fonte
De que formato de arquivo você está falando? O arquivo .brd da águia não é um arquivo de texto. Meu problema com os segmentos da trilha não é que não consigo identificá-los, mas que o único comando que sei que posso usar fará muito: o RIPUP rasga não apenas o segmento, mas também alguns segmentos adjacentes.
Wouter van Ooijen
@Wouter van Ouijen - YMMV :-). Não ser um texto em si não significa que não pode ser invadido - mas pode. Não sei como é o arquivo .brd da Eagle por dentro e não sei se é possível extrair segmentos de faixas inteiras e concatenar o restante com segurança - provavelmente não. Vale uma olhada embora. Você pode escrever um leitor e reescritor de arquivos que reconstrua o arquivo de maneira inteligente, menos as partes indesejadas. Isso dependeria de quão bem conhecido ou conhecido o formato do arquivo.
Russell McMahon
Sei que, no momento em que escrevi a pergunta, isso era verdade, mas os formatos de arquivo da Eagle agora são arquivos de texto XML simples.
akohlsmith