Как запустить tcl скрипт из командной строки windows

Обновлено: 03.07.2024

Tcl (читается «тикль», иногда «текл») — интерпретируемый язык программирования, разработанный в конце 80-х для встраивания в консольные приложения. Спектр возможностей современного Tcl довольно широк: тут и поддержка ООП, и развитые средства regexp, динамические массивы и т.д.

Поддержка этого языка впервые появилась на платформе Cisco IOS 12.2(3)T (в некоторых источниках указывается на 12.3(2), но я не нашел этому подтверждения) и в данный момент имеет несколько вариантов:

  • Интерпретатор Tcl с интерфейсом командной строки. Встроен в разные версии платформы Cisco IOS, включая IOS XE и XR и доступен для широкой линейки устройств. Позволяет выполнять команды Tcl, запускать готовые скрипты в виде файлов и т.д. Устройства, использующие в качестве операционной системы не IOS а, например, Cat OS или ASA (в одноименном брандмауэре) командной строки интерпретатора не содержат.
  • Т.н. «встроенный менеджер событий» или EEM — система отслеживания событий, позволяющая автоматически на них реагировать в режиме реального времени. Например, осуществлять мониторинг удаленного хоста с уведомлением по e-mail. EEM-сценарии (аплеты) пишутся на Tcl, но сам EEM не предоставляет отдельной командной строки Tcl. Пример использования см. тут. EEM доступен на платформе Nexus (NX OS) и ASA с версии 9.2(1) и выше.
  • Системы голосового меню IVR (Interactive Voice Responce).

image

Пункт меню Research Features позволяет выбрать конкретную версию IOS для заданного IOS Train Release или конкретной аппаратной платформы. Пункт меню Research Software позволяет найти все версии IOS с поддержкой Tcl для заданного hardware. Кликаем, фильтруем поле Filter by по названию (Feature name) «Cisco IOS scripting w/ Tcl» (или просто «Tcl»), название фичи добавляем в список, выбираем Train release и получаем список всех версий IOS, содержащих данную фичу:


К сожалению, база CFN неполная и иногда не показывает всю информацию. Так, для платформы CAT2960S навигатор показал наличие Tcl в релизе IOS 15.2E1 и не показал в релизе 15.2E9, хотя по факту интерпретатор Tcl есть и там, и там.

Что же можно сделать в Cisco IOS используя Tcl? Довольно много: просматривать и изменять конфигурацию, создавать интерактивные сценарии, оперировать объектами MIB, сокетами TCP и UDP и даже… написать целый веб-шелл!

В общем виде программа на языке Tcl содержит последовательность команд, разделенных переводом строки или точкой с запятой. Пример, не требующий пояснений:

Интерпретатор Tcl запускается командой tclsh из priveleged EXEC-режима:


Выполним первый скрипт:

image

Выход из интерпретатора — команда tclquit или просто exit. Tcl чувствителен к регистру, поэтому Puts "Hello, world" вызовет ошибку, а вот регистр команд оболочки IOS неважен. Все вводимые команды сначала обрабатываются интерпретатором Tcl, если введенная команда является исполнимой с т.з. Tcl, она исполняется и результат выводится на устройство TTY. Если команда не может быть выполнена интерпретатором, она передается парсеру команд IOS. Т.о., один скрипт может комбинировать операторы Tcl и команды IOS. Cреда IOS не содержит полноценного текстового редактора, поэтому pre-defined скрипты нужно создавать внешними средствами и уже потом копировать на flash или в память. Так же поддерживается прекомпиляция скрипта в байт-код с последующим запуском. Запуск файла со скриптом на выполнение осуществляется командой


Допустимы множественные сеансы интерпретатора Tcl из разных сессий TTY.

image


Интерпретатор Tcl не дает процессам exec напрямую взаимодействовать с консолью. Поэтому передача данных в процессы exec, запущенные из оболочки Tcl, происходит с помощью команды typeahead:
typeahead "y\ny"
exec "reload"

Сначала в буфере ввода будут сохранены два символа «y», разделенных переводом строки (\n), затем будет запущена exec-команда reload, которая читает из буфера ввода команды отмены или подтверждения перезагрузки и (если нужно) сохранения конфигурации.

Тикль не поддерживает типизацию, это надо помнить, оперируя с переменными:

image

Вложенный оператор [expr ] вычислит значение выражения, заданного в фигурных скобках ($a + $b) и выполнит подстановку этого значения вместо квадратных скобок.

Пример процедуры в Tcl:
proc ping_net for exec "ping 192.168.0.$n"
>
>
при вводе фигурной скобки интерпретатор не закроет командную строку до ввода парной закрывающей скобки. Процедура хранится в памяти интерпретатора до завершения сессии интерпретатора командой tclquit. Это дает возможность запускать процедуры и обращаться к переменным ранее запущенных скриптов. Помните, что ошибка в скрипте может привести к зацикливанию и блокировке вашего сеанса (V)TTY! Средств аварийного завершения (типа Ctrl+Break) консоль не имеет, единственный способ — новая сессия и сброс «зависшей» сессии командой clear line .

  • запрашивает с консоли порядковый номер свича sw_num
  • задает для него hostname вида switch_<sw_num>
  • запрашивает и устанавливает пароль на консоль priveleged EXEC
  • настраивает в соответствии с введенным номером свича адрес на его интерфейсе управления Fa0 (192.168.0.х) и интерфейсе Vlan1 (10.0.х.254)
  • создает port-based DHCP reservation и пул из 48 адресов, в котором за каждым клиентом зарезервирован один IP-адрес, младший октет которого равен порядковому номеру порта, через который это клиент подключен.

Примечание 1. В этом скрипте есть небольшая логическая ошибка. Попробуйте её найти.

Примечание 2. Некоторые текстовые редакторы любят помещать в конце файла непечатаемый символ EoF. Его можно увидеть в консоли IOS, выведя содержимое файла командой cat или more. Наткнувшись на EoF, интерпретатор Tcl выдаст ошибку и проигнорирует всю строку. Поэтому я оставил в конце скрипта экранирующий знак комментария.

Возникает вопрос: а как же записать скрипт в память коммутатора с ненастроенным IP работая только через консольный порт? Не набирать же скрипт руками! Неужели каждый раз вручную настраивать Management Interface и пользоваться FTP? Нет, можно проще. Cisco IOS умеет копировать файлы прямо через последовательный порт консоли по протоколу Xmodem и сохранять их на флеш. Для этого вам понадобится эмулятор терминала с поддержкой Xmodem, например, ZOC или Tera Term (а вот популярный бесплатный Putty, увы, не подойдет!). Копирование выполняется командой IOS copy xmodem: flash:filename , после чего нужно выполнить File Transfer в меню эмулятора терминала:

image

Также это можно сделать находясь в ROMmon (например, если вы «сносите» конфиг коммутатора, не имея пароля на priveleged EXEC). А вот обратное копирование файлов (с флэш-памяти коммутатора на ПК) не поддерживается.

На этом краткий экскурс в возможности языка Tcl на платформе Cisco IOS завершен, изучить вопрос более подробно вы можете в документе «Cisco IOS Scripting with TCL Configuration Guide» доступном на сайте Cisco.

Я новичок в VBScript. Я искал ее и узнал, что мы можем запустить VBScript из командной строки, выполнив следующую команду:

Например, мое имя vbscript Converter.vbs и присутствует в папке D:\VBS .

Я могу запустить его с помощью следующих методов:

Теперь я хотел бы выполнить выше VBScript без команды Cscript или Wscript , просто набрав имя VBscript name i.e. Converter.

Я НЕ ХОЧУ УКАЗАТЬ ПОЛНУЮ ПУТЬ ВЕБРИТИНА.

Я разбиваю это на несколько отдельных частей, так как каждая часть может быть выполнена индивидуально. (Я вижу подобный ответ, но я расскажу здесь более подробное объяснение.)

Первая часть, чтобы избежать ввода "CScript" (или "WScript" ), вам нужно сообщить Windows, как запустить файл *.vbs script. В моей Windows 8 (я не могу быть уверен, что все эти команды работают точно так, как показано здесь в старых Windows, но процесс тот же, даже если вам нужно немного изменить команды), запустите консольное окно (например, "командную строку", или aka [неправильно] "приглашение dos" ) и введите "assoc.vbs". Это должно привести к ответу, например:

Используя это, вы затем набираете "ftype VBSFile", что должно приводить к ответу:

Если эти два уже определены, как указано выше, ваша Windows уже настроена, чтобы знать, как запустить файл *.vbs. (BTW, WScript и CScript - это одна и та же программа с использованием разных имен. WScript запускает script, как если бы это была программа GUI, а CScript запускает ее, как если бы она была программой командной строки. См. Другие сайты и/или документацию для эти детали и предостережения.)

Вы также можете ввести "help assoc" или "help ftype" для получения дополнительной информации об этих командах, которые часто удобны, когда вы хотите автоматически запускать определенные программы, просто набрав имя файла с определенным расширением. (Будьте осторожны, поскольку некоторые расширения файлов специально настроены Windows или программами, которые вы, возможно, установили, чтобы они работали правильно. Всегда проверяйте текущие присвоенные значения, сообщаемые assoc/ftype, и сохраняйте их в текстовом файле где-нибудь, если вам нужно восстановить их.)

Вторая часть, не вводя расширение файла при вводе команды из окна консоли. Понимание того, как Windows (и программа CMD.EXE) находит команды, которые вы вводите, полезна для этого (и следующий) часть. Когда вы вводите команду, давайте использовать "querty" в качестве примера, система сначала попытается найти в ней команду внутреннего списка команд (через настройки в реестре Windows для самой системы или запрограммированные в случае CMD.EXE). Поскольку такой команды нет, она попытается найти команду в текущей переменной среды% PATH%. В старых версиях DOS/Windows CMD.EXE(и/или COMMAND.COM) автоматически добавит расширения файлов ".bat", ".exe", ".com" и, возможно, ".cmd" к имени команды, которое вы напечатано, если вы явно не набрали расширение (например, "querty.bat", чтобы избежать ошибки "querty.exe" по ошибке). В более современных Windows он попробует расширения, перечисленные в переменной среды% PATHEXT%. Итак, все, что вам нужно сделать, это добавить .vbs в% PATHEXT%. Например, здесь мой% PATHEXT%:

Теперь, если вы хотите сделать это все время без необходимости устанавливать% PATHEXT%, вам придется изменить системную среду. Ввод его в окне консоли только изменяет его для сеанса окна консоли. Я оставлю этот процесс упражнением для читателя.:-P

Третья часть, чтобы запустить script, не набирая полный путь. Эта часть, относящаяся ко второй части, существует со времен DOS. Просто убедитесь, что файл находится в одном из каталогов (папки, для вас, люди Windows!), Перечисленные в переменной среды% PATH%. Мое предложение состоит в том, чтобы сделать ваш собственный каталог для хранения различных файлов и программ, которые вы создаете или часто используете из окна консоли/командной строки (то есть не беспокойтесь об этом для программ, которые вы запускаете из стартовое меню или любой другой метод.. только консольное окно. Не связывайтесь с программами, которые установлены Windows или автоматическим установщиком, если вы не знаете, что делаете).

Объединение всех трех частей приведет к настройке вашей системы Windows, чтобы везде, где вы можете ввести команду командной строки, вы можете запустить свой VBScript, просто набрав его имя базового файла. Вы можете сделать то же самое для любого типа файла/расширения; Как вы, вероятно, видели в моем% PATHEXT%, моя система настроена на запуск сценариев Perl (.PLX;.PLW;.PL) и Python (.PY). (Я также поставил "C:\sys\bat; C:\sys\scripts; C:\sys\wsh; C:\sys\bin" в начале моего% PATH% и поместил различные командные файлы, script файлы и т.д. в этих каталогах, поэтому Windows всегда может их найти. Это также удобно, если вы хотите "переопределить" некоторые команды: сначала поместить файлы *.bat в путь, чтобы система находила их перед *. exe, например, и тогда файл *.bat может запустить реальную программу, предоставив полный путь к фактическому файлу *.exe. Узнайте о различных сайтах в "программировании пакетных файлов" для получения подробной информации и других примеров мощности командной строки.. Это еще не мертво!)

Последнее замечание:. Проверьте некоторые из других сайтов для различных предупреждений и предостережений. Этот вопрос поставил script с именем "converter.vbs", который опасно близок к команде "convert.exe", которая представляет собой программу Windows для преобразования вашего жесткого диска из файловой системы FAT в файловую систему NTFS. которые могут сжать ваш жесткий диск, если вы допустили ошибку ввода текста.

С другой стороны, используя вышеупомянутые методы, вы также можете изолировать себя от таких ошибок. В качестве примера можно использовать CONVERT.EXE. Переименуйте его в нечто вроде "REAL_CONVERT.EXE", затем создайте файл типа "C:\sys\bat\convert.bat", который содержит:

Вы также можете использовать CHOICE.EXE в современных Windows, чтобы пользователь вводил "y" или "n", если они действительно хотят продолжить, и т.д. Опять же, мощь пакетных (и скриптовых) файлов!

Вот некоторые ссылки на некоторые хорошие ресурсы о том, как использовать всю эту мощность:

Большинство этих сайтов ориентированы на пакетные файлы, но большая часть информации в них применяется для запуска любого типа файлов (*.bat), файла команды (*.cmd) и сценариев (*.vbs, *.js, *.pl, *.py и т.д.).

Всем привет! Давно не писал статьи на любимую тематику и наконец-то созрел на что-то более-менее приличное и стоящее. В этой статье речь пойдет об очень интересной задаче, с которой инженер-разработчик сталкивается чуть ли не каждый день. Предлагаю вам посмотреть, каким образом можно использовать всю мощь и простоту TCL скриптов для проектирования на FPGA. В данной статье описание базируется на ПЛИС фирмы Xilinx, но это не отменяет возможностей TCL скриптов для кристаллов ПЛИС других производителей.



Интересно? Поехали…

Что такое TCL?

TCL (Tool Command Language) — скриптовый язык высокого уровня для исполнения различных задач. Зачастую TCL применяется в связке с графической оболочкой Tk (Tool Kit), но в рамках этой статьи этот аспект рассматриваться не будет. Язык находит широкое применение в различных задачах автоматизации процессов:

  • Тестирование комплексных модулей, узлов, частей кода;
  • Скоростное прототипирование;
  • Создание графических интерфейсов для консольных приложений;
  • Внедрение в прикладные приложения и задачи.

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

Все программы на языке TCL состоят из команд, которые разделяются символом ";" или символом начала новой строки. Как и во многих других языках программирования, первое слово — команда, остальные слова — аргументы команд.

command arg1 argt2 … argN


Первая команда создает переменную NewValue, а вторая команда производит печать значения переменной в консоль. Для того, чтобы использовать переменные с пробелами используются кавычки. В остальных случаях они не требуются. Результат исполнения команд представлен на рисунке ниже:


На мой взгляд, главное удобство языка TCL заключается в том, что любой аргумент команды может быть заменен другой командой. Для этого его необходимо поместить в квадратные скобки. На примере ниже я покажу эту возможность. Помимо всего прочего, TCL способен управлять поведением программы на основе различных событий. Это означает, что обработчик команд может выполнять те или иные действия не только по условию, записанному в скрипте, но и по всевозможным внешним событиям (изменение значение переменной во внешнем файле, захват данных в канале, завершение исполнения приложения, достижение счетчика таймера определенного значения и т.д.). Язык TCL богат набором команд, содержит достаточно удобные средства работы с массивами данных и регулярными выражениями. На TCL реализована возможность написания функций и процедур, доступно описание циклов и выражений по условию, что существенно облегчает написание код.

Зачем вам TCL?

Практически все разработчики на FPGA/ASIC рано или поздно сталкиваются с языком TCL в своих проектах. В современной разработке на ПЛИС скрипты TCL активно применяются для задач автоматизации и интеграции процессов. TCL входит во все ведущие САПР ПЛИС – Quartus для Altera, ISE Design Suite и Vivado для Xilinx. Что позволяет сделать TCL?

  • создание проекта (добавление исходных файлов, установка опций, иерархии дизайна, назначение файла верхнего уровня и т.д.),
  • синтез и трассировка (вплоть до создания независимых стадий с разными настройками),
  • тестирование законченных узлов, отдельных модулей и всего проекта целиком,
  • автоматическая генерация файлов ограничений (UCF / XCI) на базе шаблонов,
  • проверка временных ограничений для синтезированного и трассированного проекта.
  • задание параметров цепей, компонентов и примитивов ПЛИС, установка опций для IP-ядер,

Все эти стадии, так или иначе, являются базовыми операциями в процессе разработки на ПЛИС: от создания моделей поведения узлов на языках VHDL/Verilog до отладки законченного проекта в САПР на этапе синтеза и трассировки. Как правило, сложные проекты содержат большое число модулей, написанных разными разработчиками, несколько IP-ядер, файлы ограничений, библиотеки и пакеты функций. В итоге, законченный проект имеет некую иерархичную структуру и набор правил для подключения тех или иных модулей к требуемым узлам проекта. Разработчику сложно держать в голове знания о том, где и как должны находиться отлаженные модули и какие функции они выполняют, если в его работе они используются, но знания об их работе не требуются на этапе разработки (так называемые “black-box” модули). На помощь приходит TCL скрипт, который управляет структурой проекта и связывает требуемые узлы по заранее подготовленным шаблонам. Это обеспечивает гибкость в разработке и даёт возможность повторяемости законченных узлов при миграции от одного проекта к другому.

Как правило, одновременно со стадией создания новых узлов для ПЛИС протекает стадия отладки этих узлов отдельно от проекта и в совокупности с законченной системой. Первичное моделирование проводится абстрагировано от ПЛИС на компьютере в специализированных САПР и средах моделирования: это Modelsim, ISim, Aldec Active-HDL и другие. Для реализации задачи отладки проектов на помощь также приходят TCL скрипты, позволяющие обрабатывать события, возникающие во время моделирования, и принимать решения по результатам работы модели. При отладке RTL-узла чисто на HDL языках может возникнуть сложность написания модели, поскольку любое изменение в поведении схемы приведет к необходимости изменения модели и наборов тестирования. Использование связки модели на HDL языке и TCL скриптах достаточно удобно и для многих решений позволяет ускорить процесс отладки, а также унифицировать сложные тесты.

За стадиями написания кода и его отладки следуют привычные шаги синтеза, размещения и трассировки проекта в кристалле ПЛИС. Пожалуй, это один из самых сложных шагов, который требует больших вычислительных ресурсов рабочей станции и длительного времени исполнения до полного завершения. Скрипты TCL позволяют управлять событиями выполнения на каждой стадии, анализировать результаты тех или иных вычислений для достижения наилучших характеристик по разводке и трассировке проекта (объем занимаемых ресурсов, максимальные тактовые частоты, допустимые значения задержек по таймингам и прочее). Кроме того, TCL дает возможность исключить рутинные действия по выбору и смене настроек, повторному запуску стадий проверок, перезапуску конкретного этапа при создании файла прошивки ПЛИС. Такая автоматизация проектирования практически полностью исключает постоянное присутствие человека на этих стадиях.

Надеюсь, что, дочитав до этих строк, вы уже убеждены в том, что TCL – удобная и мощная штука, которой крайне необходимо пользоваться в своих проектах. Ниже я разберу один из полезных скриптов, который используется нашей командой для создания проекта в среде Vivado, для добавления уже написанных файлов исходных текстов, всевозможных IP-ядер, файлов ограничений XCI и многое другое.

TCL your FPGA!

Рассмотрим один из самых простейших TCL скриптов для автоматического создания проекта на ПЛИС. Предварительные действия совсем минимальны: на локальной машине требуется наличие каталога с исходными текстами проекта, как показано на рисунке ниже.


Для удобства я использую независимые каталоги для проектов, созданных в среде Xilinx ISE Design Suite и в Vivado, если это позволяет семейство ПЛИС (7 серия: Artix, Kintex, Virtex). Исходные файлы лежат в каталоге /src, проект vivado в одноименном каталоге, а проект для среды ISE создается в каталоге /ise, но результаты синтеза и разводки сохраняются в директории /implement. Все это сделано для удобства управления проектом в целом и независимого управления в разных средах. Также это делает иерархию более наглядной и избавляет вас от кучи мусорных файлов в исходниках. Отдельно следует отметить каталог /top в директории исходных текстов, где лежит файл верхнего уровня и необходимые файлы ограничений (для ISE это *.ucf файл, для Vivado это *.xdc файл).

Проект содержит смешанные IP-ядра – старые, созданные в ISE и новые, созданные в Vivado. В каталоге core_k7 лежат все ядра, созданные в CoreGenerator для ISE. Они не регенерируются и не обновляются при использовании в проекте Vivado (причем файл *.vhd используется для моделирования, файл *.ngc – для синтеза, а файл *.xco в проект Vivado не добавляется). В каталоге /ipcores лежат новые ядра в формате *.xci, созданные непосредственно в среде Vivado. Следует отметить, что для каждого ядра требуется отдельная под-директория, иначе для IP-ядер в проекте устанавливается атрибут “LOCKED”, что не дает возможности обновлять ядра и регенерировать их для синтеза.

Перейдем к описанию TCL скрипта:


Первая строка ищет расположение TCL скрипта на локальной машине (находится в каталоге src/tcl) и создает строковую переменную с полным путём до файла.

Во второй строке создается дополнительная переменная, из которой вырезается часть пути. Обе переменные нужны для того, чтобы в следующих переменных вручную не указывать путь до проекта и название файла верхнего уровня.

Переменная PartDev содержит название кристалла ПЛИС. И это единственная переменная, которая меняется в проекте! Все остальные строки скрипта остаются НЕИЗМЕННЫМИ в любом проекте.


На следующей стадии создаются дополнительные переменные, которые определяют расположение исходных файлов, создают директорию vivado, если её нет и т.д. Хочу отметить, что я проверяю наличие директории vivado на локальной машине. Если директория существует – она удаляется и создается заново, чтобы не было никаких конфликтов в новом проекте.

Команда cd меняет рабочую директорию, а команда pwd показывает расположение рабочей директории.


Здесь все примитивно и понятно – создаются переменные, определяющие названия всех исходных файлов в каталоге /src. Для поиска файлов используется процедура findFiles, к которой мы ещё вернемся.

Отдельно производится поиск компонента узла PCI-E, который является базовой и неотъемлемой частью для всех наших проектов.


На следующей стадии производится поиск всех IP-ядер в проекте. Причем в переменную SrcSim записываются названия файлов, которые используются для моделирования. Команда lappend в цикле добавляет к переменной другие значения, формируя массив, который на языке TCL называется листом. На этом подготовительная часть скрипта заканчивается и начинается создание проекта.


Создаем проект, определяем файл верхнего уровня, устанавливаем тип кристалла ПЛИС (в данном примере это Kintex-7 K325T), добавляем найденные исходные файлы.


Устанавливаем опции для файлов моделирования (исключаем из синтеза), задаем параметр GLOBAL_INCLUDE для ядер, используемых в узле PCI-E (это специфическая особенность, требуемая для наших проектов).


На этой стадии производится поиск IP-ядер проекта в формате XCI, проверяется необходимость обновления версии ядра и параметр locked, на который влияет смена кристалла ПЛИС. После анализа ядер происходит обновление и выдается отчет об успешно завершенной операции.


Завершающая стадия, на которой происходит установка настроек синтеза и трассировки – выбирается стратегия из списка доступных. Затем поочередно запускается синтез, размещение и трассировка до полной разводки прошивки ПЛИС.

Как видно, использование скрипта позволяет избавить пользователя от рутинной работы по созданию проекта, добавлению новых файлов, обновлению IP-ядер и многих других однотипных вещей. Скрипт полностью автоматизирован и требует установки единственного аргумента – тип кристалла ПЛИС. Его можно задать как переменную в файле, либо как аргумент, который исполняется одновременно с запуском TCL-скрипта. На рисунке ниже приведен скриншот рабочей области проекта в среде Vivado, который был запущен с использованием скрипта:


Отдельно следует обратить внимание на процедуру findFiles, с помощью которой можно производить поиск всех файлов в директории. Аргументы функции: basedir – каталог поиска, pattern – маска поиска.


Поиск выполняется в несколько шагов: определение рабочей директории как шаблона файла, создание списка по имени файла с указанием полного пути и формирование массива-списка типа list, если найденных файлов больше одного. Пример работы функции findFiles приведен на рисунке ниже. Для пояснения написан цикл, который выводит на экран все найденные файлы. Как видно, указывается полный путь до каждого файла.


Скрипт запускается из командной строки, либо с использованием GUI приложения Vivado. В первом случае необходимо запустить Vivado TCL Shell и написать незамысловатую команду


Примечание: из командной строки можно запустить и графическую среду, поменяв режим запуска mode на gui.

В среде Vivado скрипты запускаются незамысловато и просто: Menu -> Tools -> Run TCL Script…


На этом знакомство с языком TCL завершается. На этом возможности автоматизации проектов не заканчиваются. В этом простом примере я хотел показать, как с использованием TCL скриптов можно автоматизировать проектирование на ПЛИС. Язык TCL является очень удобным, простым для понимания и самое главное – открытым для использования. По личным оценкам, внедрение скриптов в жизнь разработчиков позволяет в несколько раз уменьшить время на полное создание проекта от начальной до завершающей стадии, и оставить больше времени на «чистую» разработку (написание кода). Ниже приведены полезные ссылки для знакомства с TCL-скриптами на FPGA.

Выходом могло бы быть написание на языке C/C++ GUI для утилиты p11conf, например, с использованием библиотеки Qt. Но тут в памяти всплыло, что есть скриптовый язык высокого яровня Tcl (Tool Command Language), который в связке с графической библиотекой Tk (Tool Kit) и позволяет быстро создавать графические интерфейсы для консольных программ или утилит командной строки. Впервые я познакомился с пакетом Tk/Tcl в далеком 1997 году, когда планировалось на нем написать графический интерфейс для системы контроля доступа (СКД). Тогда графические возможности пакета произвели сильное впечатление и, в частности, tetris:

image

Одной из причин, по которой отказались от использования Tk/Tcl, было отсутствие для него в то время конструктора (дизайнера) аналогичного сегодняшнему, скажем, QT-designer. Освежив в памяти возможности Tk/Tcl, а нас интересовало, помимо графических возможностей, организация взаимодействия с утилитами командной строки, и убедившись, что мы стоим на правильном пути, мы принялись за поиск конструктора. После проведенного анализа имеющихся конструкторов выбор пал на дизайнер tkBuilder_for_tcl8.4:

image

Дальнейшая разработка показала правильность выбора. Конструктор оказался не только с понятным интерфейсом, но обладает отличными функциональными возможностями. Он позволяет в ходе разработки отслеживать проект не только целиком:

image

но также контролировать его отдельные части:

image

Разработчик всегда может посмотреть код всего проекта или его части:

image

Взаимодействие с утилитой командой строки, для которой разрабатывается графическая оболочка, ведется по программному каналу:

image

Когда проект завершен, то необходимо его сохранить в итоговом tcl файле:

image

О ложках дегтя

Казалось бы все, бери и запускай утилиту. Но без ложки (на самом деле двух ложек) дегтя нельзя. Первая ложка связана с формированием у виджетов (в нашем случае у виджета text) команд xScrollCommand и yScrollComand., а именно:


Не хотят они попадать в итоговый файл. В итоге их пришлось прописывать ручками. Ну и вторая ложка дегтя классическая. Дизайнер tkBuilder_for_tcl8.4 отказывается работать с русскими буквами (можеть я чего не доглядел). Подчеркиваю, это касается только дизайнера и не касается Tcl/Tk, для которого русский язык как дом родной. Здесь тоже пришлось поработать ручками:


В итоге мы получили поддержку графического интерфейса для утилиты командной строки p11conf через утилиту GUITKP11Conf.tcl:

image


Файл проекта GUIP11CONF.tkb и утилиту GUIP11CONF.tcl скачать можно здесь. Утилиту p11conf для различных платформ можно скачать здесь. Маленькое замечание. В утилите GUIP11CONF.tcl прописан путь в утилите p11conf (см. выше):

Читайте также: