УНИВЕРСИТЕТ ИТМО
Кафедра «Технологии программирования»



Главная

Новости
 Новости науки
 Важное
 Почетные доктора
 Инновации
 Культура
 Люди
 Разное
 Скартел-Yota
 Стрим
 Смольный
Учебный процесс
 Образование
 Дипломы
 Курсовые проекты
 Лабораторные работы
 Учебные курсы
 Визуализаторы
 Unimod-проекты
 Семинары
 Стипендии
Наука
 События и факты
 Госконтракты
 Статьи
 Диссертации
 Книги
 Презентации
 Свидетельства
 Сотрудничество
Исследования
 Автоматы
 Верификация
 Биоинформатика
 Искусственный интеллект
 Генетические алгоритмы
 Движение
 UniMod
 Роботы и агенты
 Нейронные сети
 ФЦП ИТМО-Аалто
 Разное

О нас
 Премии
 Сертификаты и дипломы
 Соревнования по программированию
 Прорыв
 Автографы
 Рецензии

Беллетристика
 Мотивация
 Мысли
Медиа
 Видео
 Фотографии
 Аудио
 Интервью

English
 Home

 Articles
 Posters
 Automata-Based Programming
 Initiatives
 Projects
 Presentations
 UniMod
 UniMod Projects
 Visualizers


Поиск по сайту

Яndex



   Главная / Статьи / SWITCH-технология — автоматный подход к созданию программного обеспечения «реактивных» систем (версия для печати)


SWITCH-технология — автоматный подход к созданию программного обеспечения «реактивных» систем



[ << | 1 | 2 | 3 | 4 | Литература | Приложение 1 | Приложение 2 | Приложение 3 | >> ]

Приложение 2. Пример функции, реализующей автомат

#include "photon_stuff.h"
#include "dg.h"
#include "log.h"
#include "defines.h"

void A0( int e, dg_t *dg )
{
  int y_old = dg->y0 ;
  
  #ifdef A0_BEGIN_LOGGING
    log_begin( dg, "A0", y_old, e ) ;
  #endif

  switch( dg->y0 )
  {
    case 0:
      A8( e, dg ) ;
      if( x220(dg) )                    dg->y0 = 4 ;
      else
      if( dg->y7 == 2 )                 dg->y0 = 7 ;
      else
      if( dg->y8 == 2 )                 dg->y0 = 1 ;
    break ;

    case 1:
      A4( e, dg ) ; A3( e, dg ) ; A1( e, dg ) ;
      if( dg->y4 != 0 )                 dg->y0 = 6 ;
      else
      if( dg->y7 == 2 || dg->y7 == 4 )  dg->y0 = 8 ;
      else
      if( dg->y3 != 0 )                 dg->y0 = 5 ;
      else
      if( dg->y1 == 0 )                 dg->y0 = 0 ;
      else
      if( dg->y1 == 3 )                 dg->y0 = 7 ;
      else
      if( dg->y1 == 2 )                 dg->y0 = 2 ;
    break ;

    case 2:
      A4( e, dg ) ; A3( e, dg ) ; A9( e, dg ) ;
      if( dg->y4 != 0 )                 dg->y0 = 6 ;
      else
      if( dg->y7 == 2 || dg->y7 == 4 )  dg->y0 = 8 ;
      else
      if( dg->y3 != 0 )                 dg->y0 = 5 ;
      else
      if( dg->y9 == 0 )                 dg->y0 = 0 ;
      else
      if( e == 20 )                     dg->y0 = 3 ;
    break ;

    case 3:
      A4( e, dg ) ; A3( e, dg ) ; A2( e, dg ) ;
      if( dg->y4 != 0 )                 dg->y0 = 6 ;
      else
      if( dg->y7 == 2 || dg->y7 == 4 )  dg->y0 = 8 ;
      else
      if( dg->y3 != 0 )                 dg->y0 = 5 ;
      else
      if( dg->y2 == 4 )                 dg->y0 = 7 ;
      else
      if( dg->y2 == 3 )                 dg->y0 = 4 ;
    break ;

    case 4:
      A4( e, dg ) ; A3( e, dg ) ; A10( e, dg ) ;
      if( dg->y4 != 0 )                 dg->y0 = 6 ;
      else
      if( dg->y7 == 2 || dg->y7 == 4 )  dg->y0 = 8 ;
      else
      if( dg->y3 != 0 )                 dg->y0 = 5 ;
      else
      if( dg->y10 == 5 )                dg->y0 = 8 ;
      else
      if( !x220(dg) )                   dg->y0 = 0 ;
    break ;

    case 5:
      A4( e, dg ) ; A3( e, dg ) ;
      if( dg->y4 != 0 )                 dg->y0 = 6 ;
      else
      if( dg->y3 == 0 )                 dg->y0 = 0 ;
    break ;

    case 6:
      A4( e, dg ) ;
      if( dg->y4 == 0 )                 dg->y0 = 7 ;
    break ;

    case 7:
      A11( e, dg ) ;
      if( dg->y11 == 2 )                dg->y0 = 0 ;
    break ;

    case 8:
      A12( e, dg ) ;
      if( dg->y12 == 0 )                dg->y0 = 7 ;
    break ;

    default:
      #ifdef A0_ERRORS_LOGGING
        log_write( LOG_GRAPH_ERROR, dg->number,
          "Ошибка в автомате A0: неизвестный номер состояния!", 0 ) ;
      #endif
  } ;
  
  if( y_old == dg->y0 ) goto A0_end ;  

  {
    #ifdef A0_TRANS_LOGGING
      log_trans( "A0", y_old, dg->y0 ) ;
    #endif

    #ifdef DEBUG_FRAME
      update_debug() ;
    #endif    
  } ;
  
  switch( dg->y0 )
  {
    case 0:
      A8( 0, dg ) ;
      z290_0(dg) ;
    break ;

    case 1:
      A4( 0, dg ) ; A3( 0, dg ) ; A1( 0, dg ) ;
      z290_0(dg) ;
    break ;

    case 2:
      A4( 0, dg ) ; A3( 0, dg ) ; A9( 0, dg ) ;
      z290_0(dg) ;
    break ;

    case 3:
      A4( 0, dg ) ; A3( 0, dg ) ; A2( 0, dg ) ;
      z290_2(dg) ;
    break ;

    case 4:
      A4( 0, dg ) ; A3( 0, dg ) ; A10( 0, dg ) ;
      z290_1(dg) ;
    break ;

    case 5:
      A4( 0, dg ) ; A3( 0, dg ) ;
      z290_3(dg) ;
    break ;

    case 6:
      A4( 0, dg ) ;
      z290_3(dg) ;
    break ;

    case 7:
      A11( 0, dg ) ;
      z290_0(dg) ;
    break ;

    case 8:
      A12( 0, dg ) ;
      z290_3(dg) ;
    break ;
  } ;
  
  A0_end: ;
  #ifdef A0_END_LOGGING
    log_end( dg, "A0", dg->y0, e ) ;
  #endif
} ;

[ << | 1 | 2 | 3 | 4 | Литература | Приложение 1 | Приложение 2 | Приложение 3 | >> ]



© 2002—2017 По техническим вопросам сайта: vl.ulyantsev@gmail.com