Как передать tcl-скрипт строку и правильно ее интерпретировать - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь изменить скрипт tcl, который помещает битовые файлы в fpgas, используя xsct-инструмент xilinx. Вот как это выглядит:

connect hw_server TCP:127.0.0.1:3122
targets -set -filter {jtag_cable_name =~ "Digilent JTAG-HS2 21xxx" && name =~ "xc7*"}
fpga [lindex $argv 0]
after 100
targets -set -filter {jtag_cable_name =~ "Digilent JTAG-HS2 21xxx" && name =~ "Micro*"}
loadhw system.hdf
stop
dow [lindex $argv 1]
con -block

Теперь, когда у меня несколько FPGA, я бы хотел сделать аргумент jtag_cable_name аргументом. Я пробовал это безрезультатно:

connect hw_server TCP:127.0.0.1:3121
targets -set -filter {jtag_cable_name =~ [eval [lindex[$argv 0]] && name =~ "xc7*"}
fpga [lindex $argv 1]
after 100
targets -set -filter {jtag_cable_name =~ [eval [lindex[$argv 0]] && name =~ "Micro*"}
loadhw system.hdf
stop
dow [lindex $argv 2]
con -block

вызов скрипта .tcl выглядит так:

load_fpga.tcl "Digilent JTAG-HS2 21xxx" my_bitfile.bit my_elf.elf

Как правильно передать строку и сохранить ее в кавычках, как в оригинале?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вы, вероятно, хотите:

set jtag_cable_name [lindex $argv 0]
# ...
targets -set -filter [format {jtag_cable_name =~ "%s" && name =~ "xc7*"} $jtag_cable_name]

Вы можете назначить все аргументы командной строки следующим образом:

lassign $argv  jtag_cable_name  bit_filename  elf_filename
0 голосов
/ 11 мая 2018

Чего вы не понимаете, так это того, что в tcl {Hello World} - это строка.

Если вы знакомы с такими языками, как Perl или Ruby, вы будете знакомы с концепцией буквенных и интерполированных строк.,В tcl есть три синтаксиса для строк:

  1. Все, что не содержит пробелов (пробел, табуляция, символ новой строки), является строкой.Кроме того, пробелы могут быть исключены.Экранированные пробелы не считаются пробелами.Ниже приведены строки:

    hello
    hello\ world
    
  2. Все, что сгруппировано по ", является интерполированными строками.Интерполированные строки могут содержать переменные или команды, которые будут оцениваться и подставляться.Все следующие строки говорят «привет мир»:

    set x hello
    
    "hello world"
    "$x world"
    "[set x] world"
    
  3. Все, что сгруппировано по {}, является литеральными строками.Литеральные строки не интерполируются.То есть переменные или команды не оцениваются.Ниже приведены буквенные строки:

    {hello world} ;# hello world
    {$x world}    ;# $x world
    

Есть две вещи, которые вы можете сделать, чтобы получить то, что вы хотите

  1. Заменить {} с "".Это просто превратит буквальную строку в интерполированную строку:

    "jtag_cable_name =~ [eval [lindex[$argv 0]] && name =~ \"xc7*\""
    

    отметьте, как вам нужно экранировать " внутри строки.

  2. Используйте subst команда.Команда subst выполняет подстановку строки:

    [subst {jtag_cable_name =~ [eval [lindex[$argv 0]] && name =~ "xc7*"}]
    

    Небольшое преимущество заключается в том, что вам не нужно экранировать ".Прочтите страницу руководства для subst.Это очень гибкий инструмент, позволяющий вам выбрать тип вещей, которые вы хотите заменить.Например, он позволяет оценивать только команды, но не синтаксис $.

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