Como fazer a operação em partidas individuais em uma linha completa

1

Eu tenho uma linha Verilog assim:

if (i2_0&!(i2_1)) (posedge i0_0 => (o:1'b1))=(0, 0);

Como posso convertê-lo em uma linha como:

if (i2_0 == 1'b1 & i2_1 == 1'b0) (posedge i0_0 => (o:1'b1))=(0, 0);

Basicamente, quero pesquisar as sequências alfanuméricas depois do primeiro colchete da instrução if e converter cada seção entre os colchetes ou "&" para a instrução lógica equivalente.
Por exemplo:

(i2_0& torna-se (i2_0 == 1'b1 &

e:

!(i2_1)) torna-se i2_1 == 1'b0)

no exemplo acima.

    
por Pratap 19.05.2015 / 12:36

2 respostas

0

De acordo com a explicação nos comentários:

sed "
# for lines which starts with if
/^if\b/{
    /==/! {
        # add logic statement to first alphanums after ( 
        s/\((\w\+\)/ == 1b'1 /
        # add logic statement to second alphanums after & if it is present 
        s/\(&\!\?(\?\w\+\)/ == 1b'1 /
        # if ! sign in section replace 1 by 0 at the end of statement 
        s/\!(\([^']*'\)1 )/  /g
          }
       }
" file

Outra variante - remova o everithing, exceto a parte que será modificada, altere-a, em vez de construir a linha completa de volta:

sed "/^if\b/{
        /==/!{
            h
            s/if (.*) //
            x
            s/if (\(.*\)) (.*//
            s/\w\+/& == 1'b1 /g
            s/!(\(.*\)1 )/ /g
            s/.*/if (&)/
            G
            s/\n/ /
             }
            }" file
    
por 19.05.2015 / 17:28
0

Talvez algo como:

perl -0777 -pe 's{\bif\s*\K\((([^()]++|\((?1)\))*)(?=\))}{
  $& =~ s{([&(])\s*(!?)\s*\(?(\w+\b)\)?(?!\s*(==|'\''))}{
   "$1$3 == 1'\''b".(0+!!$2)}gers}ges'
    
por 19.05.2015 / 13:35