# ToyVerilog.pm 28may15waw package ToyVerilog; use 5.010; # needs (?|alternations) extended pattern of 5.10+ use warnings; use strict; use parent 'Exporter'; our @EXPORT = qw(xform); our @EXPORT_OK = qw(); my $dq_body = qr{ [^"]* (?: \\. [^"]* )* }xms; my $d_quote_plain = qr{ " $dq_body " }xms; my $d_quote_dotted = qr{ " $dq_body (?: [.] $dq_body)+ " }xms; my $identifier = qr{ \b [[:alpha:]] [[:alpha:]\d]* \b }xms; my $number = qr{ \b \d+ \b }xms; my $prime_h = qr{ \b \d+ ' h \d+ \b }xms; my $param = qr{ $d_quote_dotted | $d_quote_plain | $identifier | $number | $prime_h }xms; my $params = qr{ $param (?: \s* , \s* $param)* }xms; my $func_name = qr{ \b [[:alpha:]]+ \b }xms; my $plain_func = qr{ $func_name \s* [(] \s* $params \s* [)] \s* }xms; my $dollar_func = qr{ \$ $plain_func }xms; my $curly = qr{ { $params } }xms; my $statement_a = qr{ # convert to e.g.: # write_x("top.inst1.inst2.reg",32'h30,status,"string") write_x \s* [(] \s* ($d_quote_dotted) \s* , \s* ($prime_h) \s* , \s* ($identifier) \s* , \s* $d_quote_plain \s* [)] }xms; my $statement_b = qr{ # convert to e.g.: # write_x("mod.ins5.ins7.val",{24'h0,4'h2,variable1,variable2},status,"string") write_x \s* [(] \s* ($d_quote_dotted) \s* , \s* ($curly) \s* , \s* ($identifier) \s* , \s* $d_quote_plain \s* [)] }xms; my $statement_c = qr{ # convert to e.g.: # write_x($psprintf("mod.ins[%d].ins[%d].val",1,2),{24'h0,4'h2,variable1,variable2},status,"string") write_x \s* [(] \s* ($dollar_func) \s* , \s* ($curly) \s* , \s* ($identifier) \s* , \s* $d_quote_plain \s* [)] }xms; # subroutines ###################################################### sub xform { my ($string, ) = @_; $string =~ s{ (?| $statement_a | $statement_b | $statement_c) } {writing.reg($1).write($3,$2)}xmsg; return $string; } 1; # inclusion success