2010-04-16 8 views
1

J'ai une carte de port très long où je veux remplacer un tas deUtilisation d'expressions régulières pour Verilog Port Mapping

SignalName[i], 

avec

.SignalName(SignalName[i]), 

Je pense que je peux le faire facilement avec des expressions régulières , mais je ne peux pas pour la vie de moi comprendre comment. Des idées?

+0

Quel éditeur utilisez-vous? –

Répondre

3

En supposant que SignalData est le fichier contenant les informations de votre carte de port, ce qui suit ferait ce que vous voulez. Dans sed s signifie substitution, regex entre la première paire de // est utilisé pour correspondre à chaque ligne. Si une correspondance est trouvée, l'expression entre la suivante/est faite pour remplacer ce qui a été apparié.

Explication des regex

\([a-zA-Z]\+\) - Matches a series of alphabets (like SignalName) and captures it into 
\1. If you want only the SignalName string to match, replace [a-zA-Z]\+ with SignalName. 
\(\[[^\]]*\]\) - Matches the [some character] part and captures it into \2 

Enfin, nous utilisons ces chaînes capturées pour construire la chaîne désirée.

Si vous voulez expérimenter avec ceci avant d'utiliser votre fichier, utilisez sed -s au lieu de sed -si. Cela montrera les résultats de la transformation sur stdout, sans réellement changer le fichier

+0

Utilisé dans vim et cela a fonctionné magnifiquement! Les expressions régulières sont vraiment comme la magie. Merci! – Adam

0

Je brûle avec 3 ans de retard, mais je recommande vivement le mode verilog pour emacs. Cela simplifie ce type d'opération pour instancier des modules. Par exemple, si vous avez un module comme celui-ci:

module submodule(
    input [1:0] ina, 
    input inb, 
    input inc, 
    output outa); 

    /*some stuff*/ 

endmodule 

Vous pouvez instancier ce en utilisant le mode Verilog:

module mymodule(
    /*AUTOOUTPUT*/ 
    /*AUTOINPUT*/); 

    submodule submod(/*AUTOINST*/); 

endmodule 

Lorsque vous développez AUTOS dans emacs (Cc Ca), vous obtenez ceci:

module mymodule(
    input [1:0] ina, 
    input inb, 
    input inc, 
    output outa); 

    submodule submod(
    .ina (ina), 
    .inb (inb), 
    .inc (inc), 
    .outa (outa)); 

endmodule 

Vous pouvez développer ceci avec des expressions régulières simplifiées et des équations Lisp pour effectuer des connexions complexes. Économise une tonne de temps en câblant ensemble un groupe de modules ou en changeant les noms de signaux à travers la hiérarchie.

Beaucoup plus d'info ici: http://www.veripool.org/wiki/verilog-mode/Verilog-mode_veritedium