Московский государственный университет путей сообщения
Опубликован: 06.09.2012 | Доступ: свободный | Студентов: 1232 / 168 | Оценка: 5.00 / 5.00 | Длительность: 35:22:00
Специальности: Разработчик аппаратуры
Лекция 19:

Методы генерации тестов PODEM, FAN и SOCRATES

< Лекция 18 || Лекция 19: 1234 || Лекция 20 >

Рассмотрим работу метода FAN на примере схемы рис. 19.8. Здесь входы A,B являются внешними, в то время как C, D, E и F соединены с выходами подсхем и имеют худшие показатели управляемости. Результаты работы FAN-алгоритма представлены в табл. 19.3[19.3]. Алгоритм стартует с начальными целями R, T и U. Отметим, что в узле разветвления S суммирование значений схем T и U дает (S,2,0). Аналогично триплеты N и P дают триплет (M,0,3). Это требует установки значения 0 на одном из входов M. Для удобства предположим, что K имеет лучший показатель управляемости. Поскольку вентиль M инвертирующего типа, то значения n_{0} и n_{1} триплета меняются местами. Таким образом, выполняется обратное распространение через каждый логический элемент, в результате чего мы достигаем узла разветвления G. Здесь имеет место конфликтная ситуация, поскольку оба значения n_{0} и n_{1} не равны нулю. Поскольку ветвь H имеет больший вес, то при разрешении конфликта мы в качестве первого варианта принимаем значение G=1. Поскольку G является головным элементом подсхемы, то присваивание значений входам A и B откладывается. Присвоенное значение G=1 вызывает конфликт на линии L, где значение L=1 обусловлено целью (Q,0,2). Но эта цель может быть достигнута путем присваивания F==1, что позволяет разрешить конфликт на G. Если бы конфликт не удалось разрешить вследствие невозможности присваивания F==1, мы были бы вынуждены рассмотреть альтернативный вариант для узла разветвления G=0. В этом случае конфликт можно разрешить путем присваивания D=0. При этом ответствующие триплеты должны быть вычислены заново. После разрешения конфликта процедура продвижения назад MBack выбирает узел разветвления, который определяет новые текущие цели.

Таблица 19.3.
Текущие цели Стем цели Голова цели
(R,0,1), (T,1,0), (U,1,0)
(T,1,0), (U,1,0), (N,0,1)
(U,1,0), (N,0,1) (S,1,0)
(N,0,1) (S,2,0)
(S,2,0), (M,0,1)
(P,0,2),  (Q,0,2) (M,0,1)
(Q,0,2) (M,0,3)
(L,0,2) (M,0,3)
(J,2,0) (M,0,3)
(G,2,0)
(K,3,0) (G,2,0)
(H,0,3) (G,2,0)
(G,2,3)
(F,0,2) (G,2,3)

В заключение рассмотрим укрупненный алгоритм метода FAN [19.3] в виде псевдокода, который представлен на рис. 19.9 в конце настоящего раздела. Здесь, прежде всего, выполняется активизация неисправности путем присваивания соответствующего значения D или D' на неисправной линии. Далее устанавливается значение признака b_flag, который позволяет процедуре продвижения назад MBack различать случаи, когда она стартует из множества начальных целей (b_flag=A), или множества целей, соответствующим узлам разветвления (b_flag=B). Второй вариант встречается, когда процедура продолжает распространение назад от узла разветвления. Далее выполняется D-распространение от неисправной линии до одного из внешних выходов схемы. При распространении D-значения через логический элемент его соседним входам присваиваются не блокирующие значения ( 1(0) для И (ИЛИ) ), которые заносятся в множество начальных целей. Если D-граница содержит два или более элемента, то FAN исследует эти элементы на приемлемость - допускают ли они D-распространение (выполняется проверка на наличие блокирующих значений соседних входов элементов). Далее FAN производит упорядочение возможных путей D-распространения в соответствии с показателями наблюдаемости. Отметим, что подобно D- алгоритму данный метод в случае необходимости выполняет одномерную и многомерную активизацию (D-распространение).

Входной параметр процедуры обратного распространения MBack имеет два значения : A и B. Значение A соответствует случаю, когда множество текущих целей \{СО\} не пусто. В этом случае производится выбор цели. В процессе обратного распространения в случае достижения головной линии (head) она добавляется во множество головных целей \{HO\}. При обратном проходе через логический элемент прежде всего необходимо определить какие значения - контролирующие или неконтролирующие необходимо присвоить его входам. Как сказано выше, правила, приведенные в табл. 19.2 позволяют выбрать вход и логическое значение. Схема, которая питает этот вход, добавляется во множество текущих целей {СО}. При достижении узла разветвления значения n_{0} и n_{1} изменяются.

Значение B входного параметра процедуры MBack используется, если множество текущих целей пусто. В этом случае узел разветвления FPO выбирается из множества целей \{FPO\}. Однако, если выбранная цель содержит конфликт, то он должен быть разрешен. Это производится путем возврата к выбору других значений для данного узла разветвления.

При инициализации признак b_flag устанавливается в 1, если по окончании фазы импликации остались неподтвержденные значения в схеме. В этой точке все множества целей инициализируются (присваивается пустое множество) и производится сброс флага b_flag. Если есть неподтвержденные линии, то они образуют множество начальных целей \{IO\}. Если D-значение не достигает внешнего выхода, элемент из D-границы добавляется в \{IO\}. Как уже отмечалось алгоритм обратного распространения реализуется в MBack. Если b_flag не установлен в 1, то нет неподтвержденных линий, которые ожидают присвоения значений. В этом случае исследуется множество целей, соответствующих узлам разветвлений \{FPO\}. Если оно не пусто, то обратное распространение выполняется от выбранного узла разветвления. По завершению кратного распространения назад в случае отсутствия конфликтов на узлах разветвления обрабатывается множество головных целей {HO}.Если есть конфликт на узле разветвления (оба значения n_{0} и n_{1} не равны нулю), то, как неоднократно отмечалось, присваивается значение с большим весом.

FAN()  / / аргументы -номер элемента и линии с константной неисправностью
{
инициализация неисправности;  // присваивание D или D' неисправной линии
b_flag=A; //режим обратного распространения от неподтвержденных линий
for(::)  //основной цикл
  {
     импликация;    //прямая и обратная
      if(необходимо обратное распространение)
         b_flag=B;  // обработка разветвлений
      if(значение D достигло внешнего выхода) {
         if(число неподтвержденных линий==0)     {
              подтверждение свободных линий;
               return(тест);
}         
         else{
              конечная_цель();
              присваивание значений линиям конечной цели;
}         
}     
     else {
          if(число элементов в D-границе >1) {  
//выбор вентиля, ближайшего к выходу
              конечная_цель();
                присваивание значений линиям конечной цели;
}           
           else if(число вентилей в D-границе ==1)
           одномерная активизация;
       else {                  //число вентилей ==0
           if (есть нерассмотренные варианты)  {
                установка нерассмотренного варианта;
                b_flag=B;
}              
               else
                     return (нет теста);
}                
}        
}    
} 

конечная_цель()
 {
    mb = 0:
    if(b_flag==A)
        mb=Mback(A);
     else if (множество целей разветвлений не пусто)
        mb=Mback(A);
      if (mb==D) {  
           конечная_цель=FPO;  //узел разветвления
           return;
}
for(;;)
     {
        if (множество головных целей пусто)
         mb=Mback(A);
         выбор головной цели;
         if(головная линия не определена)
             break;
}       
      головная цель= конечная цель;               
}   

Mback(flag)
 {
    if(flag==A)  {
       b_flag=0;
       if (число неподтвержденных линий>0)
           {Начальная цель} =неподтвержденные линии;
       if(D-значение не достигло внешнего выхода)
           добавить элемент в D-границе в начальные цели;
           {текущая_цель}={начальная_цель};
       if({текущая_цель} не пусто)  {
            выбор текущей цели;
             следущая_цель();
}     
      else {
            if (FPO ==пусто)
                return(C);
            else
                 flag=B; 
}        
}     
    if (flag==B) {
        выбор узла разветвления, ближайшего к внешнему выходу;
         if (p  достижимо от неисправной линии) или ( (n_{0}==0) или (n_{1}==0)  )
             следующая_цель();
         else
              return(D):
}          
}    

следующая_цель()
   {
      if (текущая_цель==головная линия)
          добавить текущую_цель в головные цели;
      else if (текущая_цель питается узлом разветвления)
             добавить n_{0} и n_{1} к  FPO    //согласно правилу 10 табл. 19.2
      else                           // определить следующую цель
       распространение назад согласно правилам табл. 19.2
}      
< Лекция 18 || Лекция 19: 1234 || Лекция 20 >
Дмитрий Медведевских
Дмитрий Медведевских

Добрый день  можно поинтересоваться где брать литературу предложенную в курсе ?Большинство книг я не могу найти  в известных источниках