ОЛ ничего не добавляет. Он говорит программисту, что обнаружил сомнительное место. Можешь его тупо послушаться, если плохо понимаешь что делаешь, а можешь оставить как есть.
Отрицание того, что было в прошлом цикле, это ЛЗ+NOT (NOT(вчера)), а не NOT+ЛЗ (Завтра(NOT(???))
Сравните результат при запуске
Вот видеозапись: http://recordit.co/EjrZEKJELy (это же видео в виде анимированного gif: http://g.recordit.co/EjrZEKJELy.gif )
Макрос NOTD это вход ==> NOT =задержка=> выход
Очевидно, что вариант "макрос" и "вне макроса" выдают разный ответ.
Ой, неужели вас так вводит в ступор линия задержки на выходе?
Да пёс с ней. Могу сделать такой же пример с задержкой по входу:
http://recordit.co/D78FxgJAtw (оно же http://g.recordit.co/D78FxgJAtw.gif )
Результат всё равно один и тот же: вариант с "макросом" требует двух циклов на переключение состояния, а точно такой же вариант (но без макроса) переключается на каждом цикле. Отсюда вывод: в варианте с макросом ОЛ добавляет лишнюю задержку. Иначе как ещё объяснить то, что период генератора меняется?
Вы же хотите, чтобы, при анализе схемы, она анализировалась на наличие циклов без ЛЗ?
А для этого, придётся макрос вставлять в схему в развёрнутом виде, и заново просчитывать всё дерево связей.
У Вас полцикла в макросе, а полцикла снаружи. Как проверить на ЛЗ внутри, не развернув и не "перекомпилировав" дерево проекта с развёрнутым макросом?
Вопрос хороший и он тесно пересекается с вопросом "а как вообще должны вычисляться значения выходов".
Как вам такой вариант?
1) Берём выход
2) Смотрим что к нему подключено
3) Если подключен ФБ / функция, то пытаемся вычислить этот самый ФБ/функцию. Что для этого нужно? Нужно знать значения входов.
4) Пытаемся вычислить значение каждого входа:
4.1) Если на вход подключена линия задержки, то просто берём её значение
4.2) Если вход подключена простая связь, то пытаемся вычислить значение того, откуда эта связь выходит (точно так же как на шаге 3)
5) Потом обновляем значения в линиях задержки (не хочу заострять внимание на том как именно)
Если же на этапе 4.2 наступает цикл, то говорим "ай-яй-яй, взрываем ПР и заканчиваем работу".
Теперь о том, как сделать "раздельную компиляцию".
Для того, чтобы знать "можно ли замыкать выход X на вход A" не обязательно знать весь состав макроса.
Достаточно лишь знать, что "при попытке вычислить выход X этого самого макроса нам потребуются входы A и B.
Иными словами, при компиляции макроса мы выполняем алгоритм (шаги 1..5) и таким образом мы узнаём какие входы являются "обязательными".
В конкретном же примере: Макрос DNOT(вход) == NOT(DELAY(вход)). На шаге 4.1 алгоритм понимает, что для вычисления значения макроса будет браться значение из линии задержки. И, таким образом, получается, что "выход 1 не связан напрямую со входом", и, значит, можно без проблем в результирующей программе замыкать выход на вход.
Если у макроса M входов и N выходов, то дополнительно нужно M*N бит информации, чтобы зафиксировать то, между какими входами-выходами есть прямая связь. Содержимое же макроса уже играет роли.
Или я чего-то путаю?
Последний раз редактировалось Владимир Ситников; 03.08.2017 в 20:29.