Скрипт TCL для печати диапазона строк и создания переменных - PullRequest
0 голосов
/ 31 октября 2019

Привет У меня есть код, как указано ниже


module abcd( a , b , c ,da , fa, na , ta , ma , ra ,
              ta, la , pa );

input a , b, da ,fa , na , ta , ma; 
output c , ra ,ta , 
          la ,pa ;
wire a , b , da , fa ,na ,
        ta , ma;


// MBIST Structures
mbist_hsm_p::mbist_out_hsm_t         mbist_out_hsm;
mbist_hsm_p::mbist_in_hsm_t          mbist_in_hsm;

// HMS 
kkkks ;

jsskks;

endmodule 

Необходимо принять диапазон между "MBIST Structures" и "//", а взять первую строку в качестве входной переменной и вторую строку каквыходная переменная.

Например, я пытаюсь использовать указанный ниже код



proc findrange {data start {stop ;}} {
    # Find the starting pattern
    set x1 [string first $start $data]
    if {$x1 < 0} {
        # Pattern not found
        return
    }
    # Skip the pattern
    incr x1 [string length $start]
    # Find the ending pattern after the starting position
    set x2 [string first $stop $data $x1]
    if {$x2 < 0} {
        # Return the remainder of the data when no ending pattern is found
        return [string range $data $x1 end]
    } else {
        # Return the text between the starting and ending patterns
        return [string range $data $x1 [expr {$x2 - 1}]]
    }
}


set chan [open "mode.v"]
set code [read $chan]
close $chan

set var4 [ findrange $code "MBIST Structures" \/\/]

echo $ var4 печатает эти переменные


mbist_hsm_p::mbist_out_hsm_t         mbist_out_hsm;
mbist_hsm_p::mbist_in_hsm_t          mbist_in_hsm;

Я хочу иметь два списка

$input should be "mbist_hsm_p::mbist_out_hsm_t         mbist_out_hsm;"
$output should be "mbist_hsm_p::mbist_in_hsm_t          mbist_in_hsm;"

Как создать эти переменные из переменной var4

Когда я пытаюсь распечатать переменную $ var4, она печатает 4 независимые переменные

foreach p $var4 {
echo $p
}



mbist_hsm_p::mbist_out_hsm_t
mbist_out_hsm;
mbist_hsm_p::mbist_in_hsm_t
mbist_in_hsm;
Rather it should be " mbist_hsm_p::mbist_out_hsm_t mbist_out_hsm;"
and other one should be "mbist_hsm_p::mbist_in_hsm_t mbist_in_hsm;"

Два списка я ищу $ input и $ output

1 Ответ

0 голосов
/ 01 ноября 2019

С таким коротким входным файлом намного проще прочитать весь файл в переменную. И для описанной задачи я думаю, что string first - лучший выбор, чем string match.

Так вот, как бы я это сделал:

proc findrange {data start {stop ;}} {
    # Find the starting pattern
    set x1 [string first $start $data]
    if {$x1 < 0} {
        # Pattern not found
        return
    }
    # Skip the pattern
    incr x1 [string length $start]
    # Find the ending pattern after the starting position
    set x2 [string first $stop $data $x1]
    if {$x2 < 0} {
        # Return the remainder of the data when no ending pattern is found
        return [string range $data $x1 end]
    } else {
        # Return the text between the starting and ending patterns
        return [string range $data $x1 [expr {$x2 - 1}]]
    }
}

set chan [open "mod1.v"]
set code [read $chan]
close $chan

set out [open "output.file.txt" "w"]
puts $out [findrange $code input]
puts $out [findrange $code output]
close $out

Есть некоторые изменения в беломпространство между вашим входом и желаемым выходом, который вы указали. Но вы не указали правила для этого преобразования, и они не очевидны. Итак, я игнорирую это на данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...