, пожалуйста, я являюсь гигантом домена tihs, как я могу преобразовать классический пример FIFO, написанный в коде systemC, на язык PROMELA со свойствами в LTL , удовлетворяющий следующим трем свойствам:конвертировать программу fifo systemC в язык PROMELA с защищенными свойствами и активностью жизнедеятельности
Взаимное исключение. Процессы производителя и потребителя никогда не получают доступ к общему буферу одновременно.
Non-starvation: Потребитель обращается к буферу бесконечно часто. (Вы можете предположить, что производитель никогда не исчерпывает данных на поставку, и потребитель никогда не прекращает попытки читать новые данные.)
Производитель-Потребитель: Производитель никогда не перезаписывает буфер данных, если потребитель не прочитанной текущие данные Пользователь никогда не читает буфер данных, если он не содержит новые данные. Обычный алгоритм для производителя-потребителя использует бит одного флага. Бит флага устанавливается производителем, когда данные готовы к чтению, и отменяется потребителем после его считывания. Для этого задания нам нужно только определить, был ли прочитан буфер данных, а не , моделирующий содержимое данных. Для этого мы будем использовать один бит.
Ваша задача - смоделировать этот алгоритм в Promela, а затем проверить указанные выше свойства. Это поможет вспомнить, что (1) и (3) являются безопасными свойствами, , но (2) является свойством жизнеспособности. При необходимости вы можете использовать как LTL, так и встроенные утверждения.
Это моя первая попытка решить эту проблему:
#define NUMCHAN 4
chan channels[NUMCHAN];
chan full[0];
init
{
chan ch1 = [1] of { byte };
chan ch2 = [1] of { byte };
chan ch3 = [1] of { byte };
chan ch4 = [1] of { byte };
channels[0] = ch1;
channels[1] = ch2;
channels[2] = ch3;
channels[3] = ch4;
// Add further channels above, in accordance with NUMCHAN
// First let the producer write something, then start the consumer
run producer();
atomic {
_nr_pr == 1 -> run consumer();
}
}
proctype read()
{
byte var, i;
chan theChan;
do
:: fread?1 ->
if readptr == writeptr -> empty ! 1
fi
read ! 0
readptr = readptr+1 mod NUMCHAN
ack ?1
od
ack!1
i = 0;
do
:: i == NUMCHAN -> break
:: else -> theChan = channels[i];
if
:: skip // non-deterministic skip
:: nempty(theChan) ->
theChan ? var;
printf("Read value %d from channel %d\n", var, i+1)
fi;
i++
od
}
proctype consumer()
{
do // empty
if
empty ? 0 // read // data
theChan ? data
:: fread!1 -> ack ?1
od
}
Я создал два фундаментальных процессов, производитель и потребитель.
производитель связан с другим процессом под названием записи каналом FWRITE и потребитель связан с другим процессом называется чтения каналом Fread. Здесь читать и написать письмо и написать письмо указатели.
потребитель неполный, я только набросал идею, которую я имею. Я хотел бы иметь чтение произойдет после общего написания каналов или таблицы FIFO и что производителя может написать N количества информации, не будучи удовлетворен размером от FIFO.
Комментарии не предназначены для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/130867/discussion-on-question-by-lamia-convert-fifo-systemc-program-to-promela-language). – Flexo
Для производителя, как я могу сделать это вставить информацию N и использовать указатель записи. Я уже сделал первую попытку, но я не мог уважать то, что описано выше proctype manufacturer() { byte var, i; chan theChan; i = 0; do :: i == NUMCHAN -> break :: else -> theChan = channels [i]; если :: skip; :: empty (theChan) -> \t \t theChan! 1; printf («Записать значение 1 на канал% d \ n», i + 1) fi; i ++ od } – lamia