Как стать автором
Обновить
17
0
Игорь Алимов @igoral

Разработчик

Отправить сообщение

Да вы правы, в прототипах есть накладные расходы, связанные с конкатенацией строк, преобразованием строки в последовательность байт и вызовом python функции. Но в окончательном варианте всего этого нет. Там используется C функция get_value, вызов которой обходится гораздо дешевле и она меняет строку in place, без дополнительной памяти.

По поводу сложности нахождения хеш суммы с первыми 6 нулями. Вероятность нахождения хеш суммы экспотенциально падает с каждым определенным битом. Окончательный вариант находит первую хеш сумму с 6 нулями за 12.28 секунд:

python blockchain.py -e 000000 -w 4
2022-06-02 07:44:43.640 MSK [INFO    ] blockchain Start
2022-06-02 07:44:43.640 MSK [DEBUG   ] blockchain Start thread 1, round 0
2022-06-02 07:44:43.641 MSK [DEBUG   ] blockchain Start thread 2, round 0
2022-06-02 07:44:43.641 MSK [DEBUG   ] blockchain Start thread 3, round 0
2022-06-02 07:44:43.641 MSK [DEBUG   ] blockchain Start thread 4, round 0
2022-06-02 07:44:55.920 MSK [INFO    ] blockchain Success "Начальное значение!en`#!" hash: 000000370a0f76688fb13e5f2694d7dc571603a281e063640cdeb11a458b0255 Hash rate 6581.497 kH/s

И статья все таки больше, про то как, писать 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

Есть стойкое ощущение, что как только мы добьёмся бессмертия отдельно взятого человека, это будет означать конец человечества в целом.

Спасибо, отличное правило для запоминания.

Сигнал insert_sync1 относительно сигнала insert задержится на два такта (у нас же два триггера, включенных последовательно). Выходные сигналы по сравнению с предыдущей схемой задержатся на три такта, с учётом задержки выходных регистров.

Добавил синхронизаторы для входных сигналов и регистры для выходных сигналов. Новый исходный код на ветке sync, изменения коснулись файлов soda_machine.sv и soda_machine_types.sv (добавлено новое значение I0=2'b00, отсутствие монеты). Теперь принципиальная схема выглядит так

Это LaTeX, пакет tikz. Затем pdf с помощью команды convert из ImageMagic, конвертирован в png и кадрирован.


\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows,automata} 
\begin{document}
  \begin{tikzpicture}[->,>=stealth', initial text=reset]
    \tikzstyle{every state}=[fill=blue!20]
    \node [state,initial] (S0) at (162:4) {$S_0$};
    \node [state] (S1) at (90:4) {$S_1$};
    \node [state] (S2) at (18:4) {$S_2$};
    \node [state] (S3) at (-54:4) {$S_3$};
    \node [state] (S4) at (-126:4) {$S_4$};
    \draw (S0) to[in=110, out=160, loop] node[auto] {$I_5$} ();
    \draw (S0) to[bend left] node[auto] {$I_1$} (S1);
    \draw (S0) .. controls (120:7) and (60:7) .. node[auto] {$I_2$} (S2);
    \draw (S1) to[bend left] node[auto] {$I_1$} (S2);
    \draw (S1) to[bend left] node[auto] {$I_2$} (S3);
    \draw (S1) to[bend left] node[auto] {$I_5$} (S0);
    \draw (S2) to[bend left] node[auto] {$I_1$} (S3);
    \draw (S2) .. controls (-24:7) and (-84:7) .. node[auto] {$I_2$} (S4);
    \draw (S2) .. controls (-30:15) and (-150:15) .. node[auto] {$I_5$} (S0);
    \draw (S3) to[bend left] node[auto] {$I_1$} (S4);
    \draw (S3) to[bend left] node[above right] {$I_2 \mid I_5$} (S0);
    \draw (S4) to[bend left] node[auto] {$I_1 \mid I_2 \mid I_5$} (S0);       
  \end{tikzpicture}
\end{document}
В простейшем случае, синхронизатор это два последовательно включенных D-триггера с одним сигналом тактовой частоты. Расчет строится на том, что даже если первый триггер попадает в метастабильное состояние, то за время периода тактовой частоты он придет в стабильное состояние. Есть формула, которая рассчитывает время наработки на отказ в зависимости от частоты и внутренних параметров триггера.
Согласен с вами. Добавил абзац о выходных регистрах и входных синхронизаторах.
1) Вы правы, выходы комбинационной логики в реальном проекте необходимо сохранять в регистрах и уже выходы этих регистров подавать на выход ПЛИС, в противном случае возможный ложные срабатывания (кстати, на графике сигналов они видны)
2) Входные сигналы, необходимо пропустить через синхронизатор

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

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Дата рождения
Зарегистрирован
Активность