根据上述讨论, 得到扩展D算法步骤如下:
  (1)决定p和q 的上限值P和Q 。
  (2)D驱赶的迭代:
  令p=q=0,反复执行以下步骤:
  (2.1)对电路C(p, q)施以普通的D算法(包括D驱赶和求蕴涵)。
    但当 p>0 时,在将内部状态中的D 或 值向其输入端传播的过程中不能与
    故障点的D 或 相矛盾,否则需要回溯。
  (2.2)若z(p, q)中得到了D 或 ,驱赶成功。否则,若p≥P,以失败而中止;    
    若p<P,p增1,转(2.1),继续驱赶。
  (3)一致性操作的迭代:
    令 p=q=0,反复执行以下步骤:
  (3.1)若q ≥Q,以失败而中止; 
    若y(p, q)='X…XX', 以成功而告终;
    否则q增1,转(3.2)。
  (3.2)对电路C(p, q)作一次性操作,转(3.1)。
  在操作过程中若p或q达到上限值P或Q,表明在规定范围内不能找到其测试,即以失败告终。
  作为一个例子,图7.18(a)的同步时序电路的基本组合电路模块如图7.18(b)所示,在迭代过程中逐步展开成图7.18(c )的迭代组合电路。设信号线a有故障s-a-1。扩展D算法执行过程如下:
  第一步:设p与q的上限值P=Q=10。
  第二步:D驱赶迭代:
  (1)第1次p=q=0。运算结果:a(0, 0)=D , x(0, 0)='1', y1(0, 1)=D , y2(1, 0)=D , y1(0, 0)='0', y2(0, 0)='0', z(0, 0)='0'。因信号线a的故障 未能传播到z(0, 0),故需令p增1,继续驱赶。
  (2)第2次p=1, q=0, 运算结果:a (0, 1)=D , x(0, 1)='1', y1(0, 2)=D , Y2(0, 2)=D , z(0, 1)=D , 驱赶成功。
  第三步:一致性操作的迭代。
  (1)第1次:p=q=0。因y1(0, 0), y2(0, 0)均不等于'X',令q增1,执行一致性操作,其结果为a(1, 0)='X', x(1, 0)='0', y1(1, 0)='0', y2(1, 0)='X', z(1, 0 )='0'。
  (2)第2次p=0, q=1。由于y1(0, 1)≠'X', q增1, 继续执行一致性操作,其结果为a(2, 0)='X', x(2, 0)='0', y1(2, 0)='X', y2(2, 0)='X', z(2, 0)='0', 一致性操作成功。
  这样就得到了各帧输入端在空间的值序列:{(0, 0, 1, 1)}。因而序列{(0, 0, 1, 1)}可作为原电路的测试输入序列。
  这里有两个问题:(1)扩展D算法并不能保证对所有可测故障均能找到测试输入序列。有些电路虽然能找到测试输入系列,但迭代次数过多,可能其计算时间达到不能忍受的程度。在实现时,设置上限P和Q以防止这样的情况出现。实际上对于大多数电路都可能导致失败。(2)即使能找到迭代组合电路的测试集,还需要验证是否为原电路的测试集。这也有可能导致失败。这个问题的根本解决方法,还只能从电路的逻辑设计着手解决,即设计容易求得测试输入序列的电路在后面的可测性设计一节中会讲到如何使所设计的电路容易找到测试集,容易测试。