Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вс окт 06, 2024 20:02

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: распознавалка чисел в формате языка verilog
СообщениеДобавлено: Сб июл 09, 2022 01:19 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
source file: verilog.fts
\ 02.06.2022 ~mOleg
\ Copyright [C] 2022 mOleg mOlegg@ya.ru
\ преобразование строкового представления чисел вида 3'b00101 или 10'h1AF или 7'd23 или '123

branch/ case.fts
math/ double.fts

\ разделить строку по указанному символу char
\ возвращается остаток строки asch и его длина #, начало и длина строки до разделителя
\ если разделитель не встретился, длина #h будет равна 0
: split ( asc # char --> asch #h ascl #l )
>L DDUP BOUNDS
BEGIN DDUP > WHILE
DUP C@ L@ = WHILENOT
C+
REPEAT
THEN
TUCK - DUP >L DSWAP L> -
LDROP ;

\ поиск определенного через `define имени
: Defined ( asc # --> ud asc # )
[CHAR] ' split SFIND \ искать необходимо либо не в словаре VERILOG, либо только по цепочке слов !! иначе будет рекурсия
IF EXECUTE DROP DSWAP
ELSE >STDERR ERROR" - invalid name"
THEN ;

\ определить битовую длину числа
: ?Long ( asc # --> ud asc # )
OVER C@ DUP [CHAR] ` = IF DROP Defined ;THEN
0x0A DIGIT IFNOT 0:0 DSWAP ;THEN DROP \ если битовая длина числа не задана
0:0 DSWAP 0x0A >number
DOVER 0:0 D= ABORT" Can't be zero lenght number!" ;

\ распознать число asc #, как число в системе счисления base
: ?Numb ( asc # base --> ud )
>L 0:0 DSWAP L> >number ABORT" Invalid verilog number" DROP ;

\ выбрать систему счисления для преобразования значения числа
: SelBASE ( asc # --> asc # base )
OVER C@ CASE [CHAR] b OF SKIP1 2 ENDOF
[CHAR] d OF SKIP1 0x0A ENDOF
[CHAR] h OF SKIP1 0x10 ENDOF
DROP 0x0A \ когда система счисления явно не задана используется десятичная
ENDCASE ;

\ определить систему счисления
: ?Base ( asc # --> asc # base )
OVER C@ [CHAR] ' =
IF SKIP1 SelBASE ;THEN
ERROR" Invalid verilog number!" ;

\ по номеру бита # получить установленный бит в указанной позиции числа ud
: DBIT ( # --> ud ) 32 OVER > IF BIT 0 ELSE 32 - BIT 0 SWAP THEN ;

\ маска ud для указанного младших бит № числа ud
: DMASK ( # --> ud ) DBIT 0:1 D- ;

\ инвертировать число двойной длины d
: DINVERT ( d --> ~d ) INVERT SWAP INVERT SWAP ;

\ логарифм по основанию 2 для чисел двойной длины
: DLG2 ( d --> u )
-IF DABS 1 \ д.б. на один бит длиннее, т.к. надо где-то хранить знаковый бит
ELSE 0 THEN
>L BEGIN DDUP OR WHILE \ медленно, но заморачиваться не хочется
D2/ 1 L+
REPEAT DDROP
L> ;

\ определить количество действительных бит # в числе двойной длины d
: DBITS ( d --> # )
0x80000000:0 DOVER D= IF DDROP 64 ;THEN \ DNEGATE не работает нормально, если выставлен только старший бит числа!
DLG2 ;

\ определить действительное количество бит числа двойной длины
: countDBits ( ud# ud --> ud# ud )
DOVER OR ?EXIT
DNIP DDUP DBITS S>D DSWAP ;

\ проверка, влазит ли число ud в указанное количество бит ud#,
\ лишние старшие значащие биты обрезаются
: CheckLong ( ud# ud --> ud# ud )
DOVER D>S DMASK DOVER DOVER DINVERT DAND OR
IF STRING" warning: high bit's of verilog number truncated!" >STDERR THEN
DAND ;

\ преобразовать строку asc # в записи VERILOG в значение числа ud и битовую длину числа ud#
: PosNumber ( asc # --> ud# ud ) ?Long ?Base ?Numb countDBits CheckLong ;

\ преобразовать число asc # , записанное в виде -ux'uy
:> 'VerilogNumber ( asc # --> ud # )
?SIGN IF PosNumber DNEGATE
ELSE PosNumber
THEN DSWAP D>S ;

ALSO HIDDEN

\ ячейка для хранения последнего распознанного VERILOG числа
USER-CREATE last-ver-number 3 CELLS USER-ALLOT

\ извлечь verilog число из addr
: V@ ( addr --> d # ) DUP D@ ROT 2 CELLS + @ ;

\ сохранить verilog число в addr
: V! ( d # addr --> ) TUCK 2 CELLS + ! D! ;

\ компилировать литерал verilog числа d #
: VLIT, ( d # --> )
COMPILE (BOX)
HERE A>L 0 ,
>L D, L> ,
HERE AL@ - AL> !
COMPILE V@ ;

\ литерал для verilog чисел d #
: Vliteral ( d # --> ) state IF VLIT, THEN ;

\ метод работы с verilog числами для словаря
: (VerLit) ( --> d # ) last-ver-number V@ Vliteral ; IMMEDIATE


\ попытка распознать число, заданное строкой: asc #
\ как verilog число
:> 'sVerLfa ( asc # vid --> lfa | 0 )
DROP \ vid словаря не нужен
'VerilogNumber CATCH IF DDROP 0 ;THEN
last-ver-number V! LFA (VerLit) ;

ALSO HIDDEN

init: VOCABULARY \ создание словаря
VOC-LIST A@ >L \ wordlist
'sVerLfa L@ off_quest A!
['] (mount) L@ off_mount A!
['] no-umount L@ off_umount A!
&vinit L> off_vflags B!
;stop VERILOG
PREVIOUS
PREVIOUS

\ преобразовать указанное количество цифр числа ud
: ##S ( ud # --> ud ) BEGIN DUP WHILE >L # L> 1 - REPEAT DROP ;

\ отобразить верилог число d # в текущей системе счисления
: .vn ( d # --> )
OVER >L DUP >L S>D DSWAP DABS
<# BASE@ CASE 2 OF L> ##S DDROP [CHAR] b ENDOF
10 OF LDROP #S DDROP [CHAR] d ENDOF \ количество цифр считать влом!
16 OF L> 4 /MOD SWAP IF 1 + THEN ##S DDROP [CHAR] h ENDOF
ERROR" undefined base for verilog number!"
ENDCASE HOLD [CHAR] ' HOLD
0x0A TO BASE@ #S
L> SIGN
#> TYPE ;

\ отобразить verilog число d # в шестнадцатиричной системе счисления
: .vh ( d # --> )
OVER >L DUP >L S>D DSWAP DABS
0x10 {# L> 4 /MOD SWAP IF 1 + THEN ##S DDROP s" 'h" HOLDS
0x0A TO BASE@ #S
L> SIGN
#> TYPE ;

\ отобразить verilog число d # в десятичной системе счисления
: .vd ( d # --> )
OVER >L S>D DSWAP DABS
0x0A {# #S DDROP
s" 'd" HOLDS #S
L> SIGN
#> TYPE ;

\ отобразить verilog число d # в двоичной системе счисления
: .vb ( d # --> )
OVER >L DUP >L S>D DSWAP DABS
0x02 {# L> ##S DDROP s" 'b" HOLDS
0x0A TO BASE@ #S
L> SIGN
#> TYPE ;

ALSO VERILOG UNDER


Ну, и примеры использования (просто набираем в консоли):
'123 .vn
'd123 .vn
'h1A3E .vn
10'd333 .vn
-12'b11100101010111 .vn
и т.д.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: распознавалка чисел в формате языка verilog
СообщениеДобавлено: Вс июл 10, 2022 18:54 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7968
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Что-то я попробовал увидеть тут КА или регулярные выражения, и не увидел.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: распознавалка чисел в формате языка verilog
СообщениеДобавлено: Вс июл 10, 2022 21:33 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Hishnik писал(а):
Что-то я попробовал увидеть тут КА или регулярные выражения, и не увидел.

а мне шашечки не нужны, мне ехать 8)
числа распознаются, сохраняются, компилируются

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: распознавалка чисел в формате языка verilog
СообщениеДобавлено: Вс июл 10, 2022 22:35 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7968
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Вот нормальный несложный КА здесь поедет очень даже хорошо. Главное, будет видно, что и где делается.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: распознавалка чисел в формате языка verilog
СообщениеДобавлено: Пн июл 11, 2022 10:38 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 473
Откуда: Москва
Благодарил (а): 57 раз.
Поблагодарили: 23 раз.
А, кстати, если не секрет, куда ехать? Неужели пожирать описания схем на veriloge и рожать "прошивки"?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: распознавалка чисел в формате языка verilog
СообщениеДобавлено: Пн июл 11, 2022 14:08 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
mOleg
Этот пример сделан в рамках запуска под твоим SPF4-fork?
И есть ли какая то разница в его реализации в оригинальном SPF4 vs SPF4-fork с методологической точки рассмотрения?
и в связи с этим попутный вопрос, а есть ли отдельный код для совмещения запуска этого примера в SPF4?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: распознавалка чисел в формате языка verilog
СообщениеДобавлено: Пн июл 11, 2022 16:54 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Total Vacuum писал(а):
А, кстати, если не секрет, куда ехать? Неужели пожирать описания схем на veriloge и рожать "прошивки"?


в проекте часто бывают всякие параметры, типа адресов регистров, специфичных констант и прочего, что просто лень дублировать в программе. выглядит это либо как:

`define something 16'h0FED

впрочем, тут могут быть и выражения, но без выражений можно обойтись, либо:

parameter something= 10'b100101010; (параметры могут перечисляться через запятую)

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

кстати можно делать и так:

`define DW 12
parameter one= `DW'h10, `DW'd123, `DW'b1000101;

в общем, подключаем файл из проекта верилога и с ним работаем.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: распознавалка чисел в формате языка verilog
СообщениеДобавлено: Пн июл 11, 2022 17:04 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
KPG писал(а):
mOleg
Этот пример сделан в рамках запуска под твоим SPF4-fork?
И есть ли какая то разница в его реализации в оригинальном SPF4 vs SPF4-fork с методологической точки рассмотрения?
и в связи с этим попутный вопрос, а есть ли отдельный код для совмещения запуска этого примера в SPF4?

да на форке, я к СПФу не прикасался уж лет 10.
форк- полностью переписанный СПФ4, в нем практически от СПФа ничего не осталось, поэтому без переделки не получится.
Тем более, в данном примере числа распознает словарь VERILOG , который добавляется в контекст когда нужно, в СПФ4 такого механизма просто нет (там есть NOTFOUND , но он неуправляем)

Hishnik писал(а):
Вот нормальный несложный КА здесь поедет очень даже хорошо. Главное, будет видно, что и где делается.

тут не так оно и сложно, КА выигрыша особого не даст, собственно, вот это делать через автомат (?):
\ преобразовать строку asc # в записи VERILOG в значение числа ud и битовую длину числа ud#
: PosNumber ( asc # --> ud# ud ) ?Long ?Base ?Numb countDBits CheckLong ;

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: распознавалка чисел в формате языка verilog
СообщениеДобавлено: Пн июл 11, 2022 18:55 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7968
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
А зачем в программном проекте спецификатор размера из Verilog? Он нужен для моделирования цепей, у которых разрядность физически не 32, и поэтому использование обычных переменных может дать некорректный результат. При этом integer в Verilog имеет 32 разряда.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: распознавалка чисел в формате языка verilog
СообщениеДобавлено: Вс июл 17, 2022 23:52 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Hishnik писал(а):
А зачем в программном проекте спецификатор размера из Verilog?

ну, не особо нужен, просто сделал на всякий случай.

Hishnik писал(а):
При этом integer в Verilog имеет 32 разряда.


SystemVerilog в квартусе, вроде как 64 бита,
но, с числами двойной длины проще получается распознавалка, т.к. >number 64-битный,
как и вывод: <# # #S #>

P.S. возможно учет разрядности уберу, т.к. числа могут быть записаны еще и в обычном виде ( в моем случае приходится всегда писать хотя бы так: '12 , чтобы число было в нужном формате (пока не напрягает, так как, код для верилога я пишу сам).

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: распознавалка чисел в формате языка verilog
СообщениеДобавлено: Пн июл 18, 2022 00:20 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7968
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
mOleg писал(а):
SystemVerilog в квартусе, вроде как 64 бита,

32 требуется, больше - implementation-dependent. Под 64-битными компиляторами часто 64 бита и реализуют.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: распознавалка чисел в формате языка verilog
СообщениеДобавлено: Пн июл 18, 2022 16:46 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 473
Откуда: Москва
Благодарил (а): 57 раз.
Поблагодарили: 23 раз.
mOleg писал(а):
P.S. возможно учет разрядности уберу, т.к. числа могут быть записаны еще и в обычном виде ( в моем случае приходится всегда писать хотя бы так: '12 , чтобы число было в нужном формате (пока не напрягает, так как, код для верилога я пишу сам).

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB