私Verilog次の行:
もし(i2_0&!(i2_1)) (posege i0_0 => (o:1'b1))=(0, 0);
どうすれば次のような行に変換できますか?
もし(i2_0 == 1'b1 & i2_1 == 1'b0)(posege i0_0 =>(o:1'b1))=(0、0);
デフォルトでは、ifステートメントの最初の角かっこの後に英数字文字列を検索し、角かっこまたは「&」の間の各部分を対応する論理文に変換したいと思います。
たとえば、
(i2_0&
~になる(i2_0 == 1'b1 &
そして:
!(i2_1))
~になるi2_1 == 1'b0)
上記の例では。
答え1
コメントの説明によると:
sed "
# for lines which starts with if
/^if\b/{
/==/! {
# add logic statement to first alphanums after (
s/\((\w\+\)/\1 == 1b'1 /
# add logic statement to second alphanums after & if it is present
s/\(&\!\?(\?\w\+\)/\1 == 1b'1 /
# if ! sign in section replace 1 by 0 at the end of statement
s/\!(\([^']*'\)1 )/ \10 /g
}
}
" file
その他のバリエーション - 変更する部分を除くすべての部分を削除して変更し、行全体を整理します。
sed "/^if\b/{
/==/!{
h
s/if (.*) //
x
s/if (\(.*\)) (.*/\1/
s/\w\+/& == 1'b1 /g
s/!(\(.*\)1 )/ \10/g
s/.*/if (&)/
G
s/\n/ /
}
}" file
答え2
たぶん、次のようなものがあります。
perl -0777 -pe 's{\bif\s*\K\((([^()]++|\((?1)\))*)(?=\))}{
$& =~ s{([&(])\s*(!?)\s*\(?(\w+\b)\)?(?!\s*(==|'\''))}{
"$1$3 == 1'\''b".(0+!!$2)}gers}ges'