Да вы правы, в прототипах есть накладные расходы, связанные с конкатенацией строк, преобразованием строки в последовательность байт и вызовом python функции. Но в окончательном варианте всего этого нет. Там используется C функция get_value, вызов которой обходится гораздо дешевле и она меняет строку in place, без дополнительной памяти.
По поводу сложности нахождения хеш суммы с первыми 6 нулями. Вероятность нахождения хеш суммы экспотенциально падает с каждым определенным битом. Окончательный вариант находит первую хеш сумму с 6 нулями за 12.28 секунд:
Макрос PY_SSIZE_T_CLEAN определяется перед импортом Python.h для правильного типа размера данных. Если определен макрос PY_SSIZE_T_CLEAN то тип размера данных будет Py_ssize_t,иначеint. Это особенно важно на 64 битных системах, где размер данных может превышать 2**31. Подробнее об этом Parsing arguments and building values первое примечание.
Сигнал insert_sync1 относительно сигнала insert задержится на два такта (у нас же два триггера, включенных последовательно). Выходные сигналы по сравнению с предыдущей схемой задержатся на три такта, с учётом задержки выходных регистров.
Добавил синхронизаторы для входных сигналов и регистры для выходных сигналов. Новый исходный код на ветке sync, изменения коснулись файлов soda_machine.sv и soda_machine_types.sv (добавлено новое значение I0=2'b00, отсутствие монеты). Теперь принципиальная схема выглядит так
В простейшем случае, синхронизатор это два последовательно включенных D-триггера с одним сигналом тактовой частоты. Расчет строится на том, что даже если первый триггер попадает в метастабильное состояние, то за время периода тактовой частоты он придет в стабильное состояние. Есть формула, которая рассчитывает время наработки на отказ в зависимости от частоты и внутренних параметров триггера.
1) Вы правы, выходы комбинационной логики в реальном проекте необходимо сохранять в регистрах и уже выходы этих регистров подавать на выход ПЛИС, в противном случае возможный ложные срабатывания (кстати, на графике сигналов они видны)
2) Входные сигналы, необходимо пропустить через синхронизатор
Единственно, что меня оправдывает, что это учебный проект и не хотелось его усложнять дополнительной логикой, не относящихся к теме конечных автоматов.
Да вы правы, в прототипах есть накладные расходы, связанные с конкатенацией строк, преобразованием строки в последовательность байт и вызовом python функции. Но в окончательном варианте всего этого нет. Там используется C функция get_value, вызов которой обходится гораздо дешевле и она меняет строку in place, без дополнительной памяти.
По поводу сложности нахождения хеш суммы с первыми 6 нулями. Вероятность нахождения хеш суммы экспотенциально падает с каждым определенным битом. Окончательный вариант находит первую хеш сумму с 6 нулями за 12.28 секунд:
И статья все таки больше, про то как, писать C-extension в Python, а расчет sha256 взят в качестве примера.
Пожалуй, надо признаться, что про wasm я знаю еще меньше, чем про Rust.
К сожалению, нет. Я старался выбрать пример, требующих интенсивных вычислений, который будет понятен широкой аудитории.
Написать расширение для Python на ассемблере ? Да, пожалуй это можно, но потребуется выполнить требования Python API, а так почему бы нет ?
Про Rust к сожалению, ничего не могу сказать, я сам с ним знаком на уровне Hello world.
Полный исходный код примера До / После Подробнее об этом во 2 части статьи.
Макрос PY_SSIZE_T_CLEAN определяется перед импортом Python.h для правильного типа размера данных. Если определен макрос PY_SSIZE_T_CLEAN то тип размера данных будет Py_ssize_t, иначе int. Это особенно важно на 64 битных системах, где размер данных может превышать 2**31. Подробнее об этом Parsing arguments and building values первое примечание.
Здравствуйте!
По поводу отображения меню, messagebox и еще очень много во из shell скриптов, есть отличная консольная утилита dialog. Вот ее скриншоты: https://invisible-island.net/dialog/dialog-figures.html
А по поводу локализации скриптов, на мой взгляд лучше использовать стандартные приёмы в виде gettext, и да он умеет работать с shell скриптами: https://www.gnu.org/software/gettext/manual/html_node/sh.html#sh
Есть стойкое ощущение, что как только мы добьёмся бессмертия отдельно взятого человека, это будет означать конец человечества в целом.
Спасибо, отличное правило для запоминания.
Вот как это будет выглядеть в ModelSim
Сигнал insert_sync1 относительно сигнала insert задержится на два такта (у нас же два триггера, включенных последовательно). Выходные сигналы по сравнению с предыдущей схемой задержатся на три такта, с учётом задержки выходных регистров.
Добавил синхронизаторы для входных сигналов и регистры для выходных сигналов. Новый исходный код на ветке sync, изменения коснулись файлов soda_machine.sv и soda_machine_types.sv (добавлено новое значение I0=2'b00, отсутствие монеты). Теперь принципиальная схема выглядит так
Это LaTeX, пакет tikz. Затем pdf с помощью команды convert из ImageMagic, конвертирован в png и кадрирован.
2) Входные сигналы, необходимо пропустить через синхронизатор
Единственно, что меня оправдывает, что это учебный проект и не хотелось его усложнять дополнительной логикой, не относящихся к теме конечных автоматов.