Пример #1
0
BDD bits_range_bdd(uint32_t low_bits,uint32_t high_bits) {
   BDD rval,tail,newbdd;
   int i;
   uint32_t b;
   
   if (low_bits>0) {
      tail=bddtrue;
      for (i=31,b=1;i>=0;i--,b<<=1) {
	 if (low_bits&b)
	   newbdd=bdd_addref(bdd_and(bdd_ithvar(i),tail));
	 else
	   newbdd=bdd_addref(bdd_or(bdd_ithvar(i),tail));
	 bdd_delref(tail);
	 tail=newbdd;
      }
      rval=tail;
   } else
     rval=bddtrue;
   
   if (high_bits<UINT32_MAX) {
      tail=bddtrue;
      for (i=31,b=1;i>=0;i--,b<<=1) {
	 if (high_bits&b)
	   newbdd=bdd_addref(bdd_or(bdd_nithvar(i),tail));
	 else
	   newbdd=bdd_addref(bdd_and(bdd_nithvar(i),tail));
	 bdd_delref(tail);
	 tail=newbdd;
      }
      rval=bdd_addref(bdd_and(rval,tail));
      bdd_delref(tail);
   }
   
   return rval;
}
static bddp hit_z2b_rec(zddp f, my_hash *h)
{
  if(f == zdd_top()) return bdd_bot();
  if(f == zdd_bot()) return bdd_top();

  bddp r;
  if(ht_search((uintptr_t)f, (uintptr_t*)&r, h)) return r;

  INC_RECDEPTH(recdepth);  
  bddp r0 = hit_z2b_rec(zdd_lo(f), h);
  bddp r1 = hit_z2b_rec(zdd_hi(f), h);
  DEC_RECDEPTH(recdepth);

  bddp t = bdd_node(zdd_itemval(f), r1, bdd_top());
  ENSURE_TRUE_MSG(t != BDD_NULL, "BDD operation failed");
  r = bdd_and(r0, t);
  ENSURE_TRUE_MSG(r != BDD_NULL, "BDD operation failed");

  ht_insert((uintptr_t)f, (uintptr_t)r, h);

#ifdef SIZE_LOG
  const uintmax_t insize  = zdd_size(f);
  const uintmax_t outsize = bdd_size(r);
  fprintf(sizelog, "%ju\t%ju\n", insize, outsize);
  if(maxsize < outsize) maxsize = outsize;
#endif /*SIZE_LOG*/

  return r;
}
Пример #3
0
double support(TransitionSystem *model, BDD result) {
	int count = 0;
	State *pi = model->pseudo_initial;
	State *child;
	int reals = 0;
	for(int i = 0; i < pi->children_size; i++) {
		child = pi->children[i];
		if (child == NULL)
			continue;
		BDD tt = bdd_addref(bdd_and(result, model->states_bdds[child->id]));

		if (tt == model->states_bdds[child->id])
			count += child->cardinality;

		bdd_delref(tt);
		reals += child->cardinality;
	}
	printf("%d\t%d\t", count, reals - count);
	return (double)count / reals;
}
Пример #4
0
void set_range_width(uint32_t low_code,uint32_t high_code,int width) {
   BDD x,y;

   /* sanity check */
   if (low_code>high_code)
     return;

   /* make a BDD for the range */
   x=code_range_bdd(low_code,high_code);
   
   /* if (in range) /\ (already defined) === true, we've been pre-empted */
   y=bdd_and(x,defined_codes); /* note no addref, we don't need it */
   if (y==x) {
      bdd_delref(x);
      return;
   }
   
   /* if (in range) /\ (already defined) !== false, must split */
   if (y!=bddfalse) {
      bdd_delref(x);
      set_range_width(low_code,(low_code+high_code)/2,width);
      set_range_width((low_code+high_code)/2+1,high_code,width);
      return;
   }
   
   y=bdd_addref(bdd_or(x,defined_codes));
   bdd_delref(defined_codes);
   defined_codes=y;
   
   if (width==0) {
      y=bdd_addref(bdd_or(x,zero_codes));
      bdd_delref(zero_codes);
      zero_codes=y;
   } else if (width==2) {
      y=bdd_addref(bdd_or(x,wide_codes));
      bdd_delref(wide_codes);
      wide_codes=y;
   }
   
   bdd_delref(x);
}
Пример #5
0
int main() {
bdd_init(1000000,1000000,40);
bdd_ptr v1 = ithvar(0);
bdd_ptr v4 = ithvar(1);
bdd_ptr v8 = ithvar(2);
bdd_ptr v11 = ithvar(3);
bdd_ptr v14 = ithvar(4);
bdd_ptr v17 = ithvar(5);
bdd_ptr v21 = ithvar(6);
bdd_ptr v24 = ithvar(7);
bdd_ptr v27 = ithvar(8);
bdd_ptr v30 = ithvar(9);
bdd_ptr v34 = ithvar(10);
bdd_ptr v37 = ithvar(11);
bdd_ptr v40 = ithvar(12);
bdd_ptr v43 = ithvar(13);
bdd_ptr v47 = ithvar(14);
bdd_ptr v50 = ithvar(15);
bdd_ptr v53 = ithvar(16);
bdd_ptr v56 = ithvar(17);
bdd_ptr v60 = ithvar(18);
bdd_ptr v63 = ithvar(19);
bdd_ptr v66 = ithvar(20);
bdd_ptr v69 = ithvar(21);
bdd_ptr v73 = ithvar(22);
bdd_ptr v76 = ithvar(23);
bdd_ptr v79 = ithvar(24);
bdd_ptr v82 = ithvar(25);
bdd_ptr v86 = ithvar(26);
bdd_ptr v89 = ithvar(27);
bdd_ptr v92 = ithvar(28);
bdd_ptr v95 = ithvar(29);
bdd_ptr v99 = ithvar(30);
bdd_ptr v102 = ithvar(31);
bdd_ptr v105 = ithvar(32);
bdd_ptr v108 = ithvar(33);
bdd_ptr v112 = ithvar(34);
bdd_ptr v115 = ithvar(35);
std::cout << 0 << std::endl;
bdd_ptr v118 = bdd_not(v1);
std::cout << 1 << std::endl;
bdd_ptr v119 = bdd_not(v4);
std::cout << 2 << std::endl;
bdd_ptr v122 = bdd_not(v11);
std::cout << 3 << std::endl;
bdd_ptr v123 = bdd_not(v17);
std::cout << 4 << std::endl;
bdd_ptr v126 = bdd_not(v24);
std::cout << 5 << std::endl;
bdd_ptr v127 = bdd_not(v30);
std::cout << 6 << std::endl;
bdd_ptr v130 = bdd_not(v37);
std::cout << 7 << std::endl;
bdd_ptr v131 = bdd_not(v43);
std::cout << 8 << std::endl;
bdd_ptr v134 = bdd_not(v50);
std::cout << 9 << std::endl;
bdd_ptr v135 = bdd_not(v56);
std::cout << 10 << std::endl;
bdd_ptr v138 = bdd_not(v63);
std::cout << 11 << std::endl;
bdd_ptr v139 = bdd_not(v69);
std::cout << 12 << std::endl;
bdd_ptr v142 = bdd_not(v76);
std::cout << 13 << std::endl;
bdd_ptr v143 = bdd_not(v82);
std::cout << 14 << std::endl;
bdd_ptr v146 = bdd_not(v89);
std::cout << 15 << std::endl;
bdd_ptr v147 = bdd_not(v95);
std::cout << 16 << std::endl;
bdd_ptr v150 = bdd_not(v102);
std::cout << 17 << std::endl;
bdd_ptr v151 = bdd_not(v108);
std::cout << 18 << std::endl;
bdd_ptr v154 = bdd_nand(v118,v4);
std::cout << 19 << std::endl;
bdd_ptr v157 = bdd_nor(v8,v119);
std::cout << 20 << std::endl;
bdd_ptr v158 = bdd_nor(v14,v119);
std::cout << 21 << std::endl;
bdd_ptr v159 = bdd_nand(v122,v17);
std::cout << 22 << std::endl;
bdd_ptr v162 = bdd_nand(v126,v30);
std::cout << 23 << std::endl;
bdd_ptr v165 = bdd_nand(v130,v43);
std::cout << 24 << std::endl;
bdd_ptr v168 = bdd_nand(v134,v56);
std::cout << 25 << std::endl;
bdd_ptr v171 = bdd_nand(v138,v69);
std::cout << 26 << std::endl;
bdd_ptr v174 = bdd_nand(v142,v82);
std::cout << 27 << std::endl;
bdd_ptr v177 = bdd_nand(v146,v95);
std::cout << 28 << std::endl;
bdd_ptr v180 = bdd_nand(v150,v108);
std::cout << 29 << std::endl;
bdd_ptr v183 = bdd_nor(v21,v123);
std::cout << 30 << std::endl;
bdd_ptr v184 = bdd_nor(v27,v123);
std::cout << 31 << std::endl;
bdd_ptr v185 = bdd_nor(v34,v127);
std::cout << 32 << std::endl;
bdd_ptr v186 = bdd_nor(v40,v127);
std::cout << 33 << std::endl;
bdd_ptr v187 = bdd_nor(v47,v131);
std::cout << 34 << std::endl;
bdd_ptr v188 = bdd_nor(v53,v131);
std::cout << 35 << std::endl;
bdd_ptr v189 = bdd_nor(v60,v135);
std::cout << 36 << std::endl;
bdd_ptr v190 = bdd_nor(v66,v135);
std::cout << 37 << std::endl;
bdd_ptr v191 = bdd_nor(v73,v139);
std::cout << 38 << std::endl;
bdd_ptr v192 = bdd_nor(v79,v139);
std::cout << 39 << std::endl;
bdd_ptr v193 = bdd_nor(v86,v143);
std::cout << 40 << std::endl;
bdd_ptr v194 = bdd_nor(v92,v143);
std::cout << 41 << std::endl;
bdd_ptr v195 = bdd_nor(v99,v147);
std::cout << 42 << std::endl;
bdd_ptr v196 = bdd_nor(v105,v147);
std::cout << 43 << std::endl;
bdd_ptr v197 = bdd_nor(v112,v151);
std::cout << 44 << std::endl;
bdd_ptr v198 = bdd_nor(v115,v151);
std::cout << 45 << std::endl;
bdd_ptr v199_1_0 = bdd_and(v154,v159);
bdd_ptr v199_1_2 = bdd_and(v162,v165);
bdd_ptr v199_1_4 = bdd_and(v168,v171);
bdd_ptr v199_1_6 = bdd_and(v174,v177);
bdd_ptr v199_2_0 = bdd_and(v199_1_0,v199_1_2);
bdd_ptr v199_2_4 = bdd_and(v199_1_4,v199_1_6);
bdd_ptr v199_3_0 = bdd_and(v199_2_0,v199_2_4);
bdd_ptr v199 = bdd_and(v199_3_0,v180);
std::cout << 46 << std::endl;
bdd_ptr v203 = bdd_not(v199);
std::cout << 47 << std::endl;
bdd_ptr v213 = bdd_not(v199);
std::cout << 48 << std::endl;
bdd_ptr v223 = bdd_not(v199);
std::cout << 49 << std::endl;
bdd_ptr v224 = bdd_xor(v203,v154);
std::cout << 50 << std::endl;
bdd_ptr v227 = bdd_xor(v203,v159);
std::cout << 51 << std::endl;
bdd_ptr v230 = bdd_xor(v203,v162);
std::cout << 52 << std::endl;
bdd_ptr v233 = bdd_xor(v203,v165);
std::cout << 53 << std::endl;
bdd_ptr v236 = bdd_xor(v203,v168);
std::cout << 54 << std::endl;
bdd_ptr v239 = bdd_xor(v203,v171);
std::cout << 55 << std::endl;
bdd_ptr v242 = bdd_nand(v1,v213);
std::cout << 56 << std::endl;
bdd_ptr v243 = bdd_xor(v203,v174);
std::cout << 57 << std::endl;
bdd_ptr v246 = bdd_nand(v213,v11);
std::cout << 58 << std::endl;
bdd_ptr v247 = bdd_xor(v203,v177);
std::cout << 59 << std::endl;
bdd_ptr v250 = bdd_nand(v213,v24);
std::cout << 60 << std::endl;
bdd_ptr v251 = bdd_xor(v203,v180);
std::cout << 61 << std::endl;
bdd_ptr v254 = bdd_nand(v213,v37);
std::cout << 62 << std::endl;
bdd_ptr v255 = bdd_nand(v213,v50);
std::cout << 63 << std::endl;
bdd_ptr v256 = bdd_nand(v213,v63);
std::cout << 64 << std::endl;
bdd_ptr v257 = bdd_nand(v213,v76);
std::cout << 65 << std::endl;
bdd_ptr v258 = bdd_nand(v213,v89);
std::cout << 66 << std::endl;
bdd_ptr v259 = bdd_nand(v213,v102);
std::cout << 67 << std::endl;
bdd_ptr v260 = bdd_nand(v224,v157);
std::cout << 68 << std::endl;
bdd_ptr v263 = bdd_nand(v224,v158);
std::cout << 69 << std::endl;
bdd_ptr v264 = bdd_nand(v227,v183);
std::cout << 70 << std::endl;
bdd_ptr v267 = bdd_nand(v230,v185);
std::cout << 71 << std::endl;
bdd_ptr v270 = bdd_nand(v233,v187);
std::cout << 72 << std::endl;
bdd_ptr v273 = bdd_nand(v236,v189);
std::cout << 73 << std::endl;
bdd_ptr v276 = bdd_nand(v239,v191);
std::cout << 74 << std::endl;
bdd_ptr v279 = bdd_nand(v243,v193);
std::cout << 75 << std::endl;
bdd_ptr v282 = bdd_nand(v247,v195);
std::cout << 76 << std::endl;
bdd_ptr v285 = bdd_nand(v251,v197);
std::cout << 77 << std::endl;
bdd_ptr v288 = bdd_nand(v227,v184);
std::cout << 78 << std::endl;
bdd_ptr v289 = bdd_nand(v230,v186);
std::cout << 79 << std::endl;
bdd_ptr v290 = bdd_nand(v233,v188);
std::cout << 80 << std::endl;
bdd_ptr v291 = bdd_nand(v236,v190);
std::cout << 81 << std::endl;
bdd_ptr v292 = bdd_nand(v239,v192);
std::cout << 82 << std::endl;
bdd_ptr v293 = bdd_nand(v243,v194);
std::cout << 83 << std::endl;
bdd_ptr v294 = bdd_nand(v247,v196);
std::cout << 84 << std::endl;
bdd_ptr v295 = bdd_nand(v251,v198);
std::cout << 85 << std::endl;
bdd_ptr v296_1_0 = bdd_and(v260,v264);
bdd_ptr v296_1_2 = bdd_and(v267,v270);
bdd_ptr v296_1_4 = bdd_and(v273,v276);
bdd_ptr v296_1_6 = bdd_and(v279,v282);
bdd_ptr v296_2_0 = bdd_and(v296_1_0,v296_1_2);
bdd_ptr v296_2_4 = bdd_and(v296_1_4,v296_1_6);
bdd_ptr v296_3_0 = bdd_and(v296_2_0,v296_2_4);
bdd_ptr v296 = bdd_and(v296_3_0,v285);
std::cout << 86 << std::endl;
bdd_ptr v300 = bdd_not(v263);
std::cout << 87 << std::endl;
bdd_ptr v301 = bdd_not(v288);
std::cout << 88 << std::endl;
bdd_ptr v302 = bdd_not(v289);
std::cout << 89 << std::endl;
bdd_ptr v303 = bdd_not(v290);
std::cout << 90 << std::endl;
bdd_ptr v304 = bdd_not(v291);
std::cout << 91 << std::endl;
bdd_ptr v305 = bdd_not(v292);
std::cout << 92 << std::endl;
bdd_ptr v306 = bdd_not(v293);
std::cout << 93 << std::endl;
bdd_ptr v307 = bdd_not(v294);
std::cout << 94 << std::endl;
bdd_ptr v308 = bdd_not(v295);
std::cout << 95 << std::endl;
bdd_ptr v309 = bdd_not(v296);
std::cout << 96 << std::endl;
bdd_ptr v319 = bdd_not(v296);
std::cout << 97 << std::endl;
bdd_ptr v329 = bdd_not(v296);
std::cout << 98 << std::endl;
bdd_ptr v330 = bdd_xor(v309,v260);
std::cout << 99 << std::endl;
bdd_ptr v331 = bdd_xor(v309,v264);
std::cout << 100 << std::endl;
bdd_ptr v332 = bdd_xor(v309,v267);
std::cout << 101 << std::endl;
bdd_ptr v333 = bdd_xor(v309,v270);
std::cout << 102 << std::endl;
bdd_ptr v334 = bdd_nand(v8,v319);
std::cout << 103 << std::endl;
bdd_ptr v335 = bdd_xor(v309,v273);
std::cout << 104 << std::endl;
bdd_ptr v336 = bdd_nand(v319,v21);
std::cout << 105 << std::endl;
bdd_ptr v337 = bdd_xor(v309,v276);
std::cout << 106 << std::endl;
bdd_ptr v338 = bdd_nand(v319,v34);
std::cout << 107 << std::endl;
bdd_ptr v339 = bdd_xor(v309,v279);
std::cout << 108 << std::endl;
bdd_ptr v340 = bdd_nand(v319,v47);
std::cout << 109 << std::endl;
bdd_ptr v341 = bdd_xor(v309,v282);
std::cout << 110 << std::endl;
bdd_ptr v342 = bdd_nand(v319,v60);
std::cout << 111 << std::endl;
bdd_ptr v343 = bdd_xor(v309,v285);
std::cout << 112 << std::endl;
bdd_ptr v344 = bdd_nand(v319,v73);
std::cout << 113 << std::endl;
bdd_ptr v345 = bdd_nand(v319,v86);
std::cout << 114 << std::endl;
bdd_ptr v346 = bdd_nand(v319,v99);
std::cout << 115 << std::endl;
bdd_ptr v347 = bdd_nand(v319,v112);
std::cout << 116 << std::endl;
bdd_ptr v348 = bdd_nand(v330,v300);
std::cout << 117 << std::endl;
bdd_ptr v349 = bdd_nand(v331,v301);
std::cout << 118 << std::endl;
bdd_ptr v350 = bdd_nand(v332,v302);
std::cout << 119 << std::endl;
bdd_ptr v351 = bdd_nand(v333,v303);
std::cout << 120 << std::endl;
bdd_ptr v352 = bdd_nand(v335,v304);
std::cout << 121 << std::endl;
bdd_ptr v353 = bdd_nand(v337,v305);
std::cout << 122 << std::endl;
bdd_ptr v354 = bdd_nand(v339,v306);
std::cout << 123 << std::endl;
bdd_ptr v355 = bdd_nand(v341,v307);
std::cout << 124 << std::endl;
bdd_ptr v356 = bdd_nand(v343,v308);
std::cout << 125 << std::endl;
bdd_ptr v357_1_0 = bdd_and(v348,v349);
bdd_ptr v357_1_2 = bdd_and(v350,v351);
bdd_ptr v357_1_4 = bdd_and(v352,v353);
bdd_ptr v357_1_6 = bdd_and(v354,v355);
bdd_ptr v357_2_0 = bdd_and(v357_1_0,v357_1_2);
bdd_ptr v357_2_4 = bdd_and(v357_1_4,v357_1_6);
bdd_ptr v357_3_0 = bdd_and(v357_2_0,v357_2_4);
bdd_ptr v357 = bdd_and(v357_3_0,v356);
std::cout << 126 << std::endl;
bdd_ptr v360 = bdd_not(v357);
std::cout << 127 << std::endl;
bdd_ptr v370 = bdd_not(v357);
std::cout << 128 << std::endl;
bdd_ptr v371 = bdd_nand(v14,v360);
std::cout << 129 << std::endl;
bdd_ptr v372 = bdd_nand(v360,v27);
std::cout << 130 << std::endl;
bdd_ptr v373 = bdd_nand(v360,v40);
std::cout << 131 << std::endl;
bdd_ptr v374 = bdd_nand(v360,v53);
std::cout << 132 << std::endl;
bdd_ptr v375 = bdd_nand(v360,v66);
std::cout << 133 << std::endl;
bdd_ptr v376 = bdd_nand(v360,v79);
std::cout << 134 << std::endl;
bdd_ptr v377 = bdd_nand(v360,v92);
std::cout << 135 << std::endl;
bdd_ptr v378 = bdd_nand(v360,v105);
std::cout << 136 << std::endl;
bdd_ptr v379 = bdd_nand(v360,v115);
std::cout << 137 << std::endl;
bdd_ptr v380_1_0 = bdd_nand(v4,v242);
bdd_ptr v380_1_2 = bdd_nand(v334,v371);
bdd_ptr v380 = bdd_nand(v380_1_0,v380_1_2);
std::cout << 138 << std::endl;
bdd_ptr v381_1_0 = bdd_nand(v246,v336);
bdd_ptr v381_1_2 = bdd_nand(v372,v17);
bdd_ptr v381 = bdd_nand(v381_1_0,v381_1_2);
std::cout << 139 << std::endl;
bdd_ptr v386_1_0 = bdd_nand(v250,v338);
bdd_ptr v386_1_2 = bdd_nand(v373,v30);
bdd_ptr v386 = bdd_nand(v386_1_0,v386_1_2);
std::cout << 140 << std::endl;
bdd_ptr v393_1_0 = bdd_nand(v254,v340);
bdd_ptr v393_1_2 = bdd_nand(v374,v43);
bdd_ptr v393 = bdd_nand(v393_1_0,v393_1_2);
std::cout << 141 << std::endl;
bdd_ptr v399_1_0 = bdd_nand(v255,v342);
bdd_ptr v399_1_2 = bdd_nand(v375,v56);
bdd_ptr v399 = bdd_nand(v399_1_0,v399_1_2);
std::cout << 142 << std::endl;
bdd_ptr v404_1_0 = bdd_nand(v256,v344);
bdd_ptr v404_1_2 = bdd_nand(v376,v69);
bdd_ptr v404 = bdd_nand(v404_1_0,v404_1_2);
std::cout << 143 << std::endl;
bdd_ptr v407_1_0 = bdd_nand(v257,v345);
bdd_ptr v407_1_2 = bdd_nand(v377,v82);
bdd_ptr v407 = bdd_nand(v407_1_0,v407_1_2);
std::cout << 144 << std::endl;
bdd_ptr v411_1_0 = bdd_nand(v258,v346);
bdd_ptr v411_1_2 = bdd_nand(v378,v95);
bdd_ptr v411 = bdd_nand(v411_1_0,v411_1_2);
std::cout << 145 << std::endl;
bdd_ptr v414_1_0 = bdd_nand(v259,v347);
bdd_ptr v414_1_2 = bdd_nand(v379,v108);
bdd_ptr v414 = bdd_nand(v414_1_0,v414_1_2);
std::cout << 146 << std::endl;
bdd_ptr v415 = bdd_not(v380);
std::cout << 147 << std::endl;
bdd_ptr v416_1_0 = bdd_and(v381,v386);
bdd_ptr v416_1_2 = bdd_and(v393,v399);
bdd_ptr v416_1_4 = bdd_and(v404,v407);
bdd_ptr v416_1_6 = bdd_and(v411,v414);
bdd_ptr v416_2_0 = bdd_and(v416_1_0,v416_1_2);
bdd_ptr v416_2_4 = bdd_and(v416_1_4,v416_1_6);
bdd_ptr v416 = bdd_and(v416_2_0,v416_2_4);
std::cout << 148 << std::endl;
bdd_ptr v417 = bdd_not(v393);
std::cout << 149 << std::endl;
bdd_ptr v418 = bdd_not(v404);
std::cout << 150 << std::endl;
bdd_ptr v419 = bdd_not(v407);
std::cout << 151 << std::endl;
bdd_ptr v420 = bdd_not(v411);
std::cout << 152 << std::endl;
bdd_ptr v421 = bdd_nor(v415,v416);
std::cout << 153 << std::endl;
bdd_ptr v422 = bdd_nand(v386,v417);
std::cout << 154 << std::endl;
bdd_ptr v425_1_0 = bdd_nand(v386,v393);
bdd_ptr v425_1_2 = bdd_nand(v418,v399);
bdd_ptr v425 = bdd_nand(v425_1_0,v425_1_2);
std::cout << 155 << std::endl;
bdd_ptr v428_1_0 = bdd_nand(v399,v393);
bdd_ptr v428 = bdd_nand(v428_1_0,v419);
std::cout << 156 << std::endl;
bdd_ptr v429_1_0 = bdd_nand(v386,v393);
bdd_ptr v429_1_2 = bdd_nand(v407,v420);
bdd_ptr v429 = bdd_nand(v429_1_0,v429_1_2);
std::cout << 157 << std::endl;
bdd_ptr v430_1_0 = bdd_nand(v381,v386);
bdd_ptr v430_1_2 = bdd_nand(v422,v399);
bdd_ptr v430 = bdd_nand(v430_1_0,v430_1_2);
std::cout << 158 << std::endl;
bdd_ptr v431_1_0 = bdd_nand(v381,v386);
bdd_ptr v431_1_2 = bdd_nand(v425,v428);
bdd_ptr v431 = bdd_nand(v431_1_0,v431_1_2);
std::cout << 159 << std::endl;
bdd_ptr v432_1_0 = bdd_nand(v381,v422);
bdd_ptr v432_1_2 = bdd_nand(v425,v429);
bdd_ptr v432 = bdd_nand(v432_1_0,v432_1_2);
return 0;
}
Пример #6
0
/**Function********************************************************************


  Synopsis    [Generates a complete trace]

  Description [This function is a private service of
  bdd_partial_trace_executor_execute]

  SideEffects [None]

******************************************************************************/
static Trace_ptr
bdd_partial_trace_executor_generate(const BDDPartialTraceExecutor_ptr self,
                                    const BddStates goal_states,
                                    node_ptr reachable, int length,
                                    const NodeList_ptr language,
                                    const char* trace_name)
{
  Trace_ptr res;
  DdManager* dd;
  node_ptr path;
  bdd_ptr target;

  NODE_LIST_CHECK_INSTANCE(language);

  dd = BddEnc_get_dd_manager(self->enc);

  target = BddEnc_pick_one_state_rand(self->enc, goal_states);
  path = cons((node_ptr) target, Nil);

  if (Nil != reachable) {
    reachable = cdr(reachable);
    while (0 != length) {
      bdd_ptr source;
      bdd_ptr input;
      bdd_ptr inputs;
      bdd_ptr bwd_image;
      bdd_ptr intersect;

      /* pick source state */
      bwd_image = BddFsm_get_backward_image(self->fsm, target);
      intersect = bdd_and(dd, bwd_image, (bdd_ptr) car(reachable));
      nusmv_assert(!bdd_is_false(dd, intersect));
      source = BddEnc_pick_one_state(self->enc, intersect);
      bdd_free(dd, intersect);
      bdd_free(dd, bwd_image);

      /* pick one input s.t. source -> (input) -> target */
      inputs = BddFsm_states_to_states_get_inputs(self->fsm, source, target);
      input = BddEnc_pick_one_input(self->enc, inputs);
      nusmv_assert(!bdd_is_false(dd, input));
      bdd_free(dd, inputs);

      /* prepend input and source state */
      path = cons((node_ptr) input, path);
      path = cons((node_ptr) source, path);

      -- length;
      target = source;
      reachable = cdr(reachable);
    }
  }
  /* make sure the trace length is correct */
  nusmv_assert(0 == length &&  Nil == reachable);

  res = \
    Mc_create_trace_from_bdd_state_input_list(self->enc, language, trace_name,
                                              TRACE_TYPE_EXECUTION, path);
  /* cleanup */
  walk_dd(dd, bdd_free, path);
  free_list(path);

  return res;
}
Пример #7
0
/**Function********************************************************************

  Synopsis [Executes a trace on the fsm given at construction time
  using BDDs]

  Description [The trace is executed using BDDs, that is a proof that
  the fsm is compatible with the trace is built (if such proof
  exists). Incomplete traces are filled-in with compatible values for
  state and input variables.

  Given trace can be either complete or incomplete.

  The number of performed steps (transitions) is returned in *n_steps,
  if a non-NULL pointer is given. If the initial state is not
  compatible -1 is written.]

  SideEffects [None]

  SeeAlso     []

******************************************************************************/
static Trace_ptr
bdd_partial_trace_executor_execute
(const PartialTraceExecutor_ptr partial_executor, const Trace_ptr trace,
 const NodeList_ptr language, int* n_steps)
{
  /* local references to self */
  const BDDPartialTraceExecutor_ptr self = \
    BDD_PARTIAL_TRACE_EXECUTOR(partial_executor);

  const BaseTraceExecutor_ptr executor = \
    BASE_TRACE_EXECUTOR(partial_executor);

  Trace_ptr res = TRACE(NULL); /* failure */

  int count = -1;
  boolean success = true;

  DdManager* dd;
  BddStates trace_states;
  TraceIter step = TRACE_END_ITER;

  BddStates fwd_image = (BddStates) NULL;
  node_ptr path = Nil; /* forward constrained images will be used
                          later to compute the complete trace */

  const char* trace_description = "BDD Execution";

  /* 0- Check prerequisites */
  BDD_PARTIAL_TRACE_EXECUTOR_CHECK_INSTANCE(self);
  TRACE_CHECK_INSTANCE(trace);
  BDD_FSM_CHECK_INSTANCE(self->fsm);
  BDD_ENC_CHECK_INSTANCE(self->enc);

  dd = BddEnc_get_dd_manager(self->enc);

  step = trace_first_iter(trace);
  nusmv_assert(TRACE_END_ITER != step);

  trace_states = TraceUtils_fetch_as_bdd(trace, step,
                                         TRACE_ITER_SF_SYMBOLS, self->enc);

  /* 1- Check Start State */
  {
    bdd_ptr init_bdd = BddFsm_get_init(self->fsm);
    bdd_ptr invar_bdd = BddFsm_get_state_constraints(self->fsm);
    BddStates source_states; /* last known states */

    source_states = bdd_and(dd, init_bdd, invar_bdd);
    bdd_and_accumulate(dd, &source_states, trace_states);

    bdd_free(dd, invar_bdd);
    bdd_free(dd, init_bdd);
    bdd_free(dd, trace_states);

    if (!bdd_is_false(dd, source_states)) {

      boolean terminate = false;
      path = cons(NODE_PTR(bdd_dup(source_states)), Nil);

      ++ count;

      /* 2- Check Consecutive States are related by transition relation */
      do {
        BddStates last_state; /* (unshifted) next state */
        BddStates next_state; /* next state constraints */

        BddInputs next_input; /* next input constraints */
        BddStatesInputsNexts next_combo; /* state-input-next constraints */

        BddStatesInputsNexts constraints;

        step = TraceIter_get_next(step);
        if (TRACE_END_ITER != step) {

          next_input = \
            TraceUtils_fetch_as_bdd(trace, step, TRACE_ITER_I_SYMBOLS,
                                    self->enc);
          next_combo = \
            TraceUtils_fetch_as_bdd(trace, step, TRACE_ITER_COMBINATORIAL,
                                    self->enc);
          last_state = \
            TraceUtils_fetch_as_bdd(trace, step, TRACE_ITER_SF_SYMBOLS,
                                    self->enc);

          next_state = BddEnc_state_var_to_next_state_var(self->enc, last_state);

          if (0 < BaseTraceExecutor_get_verbosity(executor)) {
            fprintf(BaseTraceExecutor_get_output_stream(executor),
                    "-- executing step %d ... ", 1 + count);
            fflush(BaseTraceExecutor_get_output_stream(executor));
          }

          /* building constrained fwd image */
          constraints = bdd_and(dd, next_input, next_combo);
          bdd_and_accumulate(dd, &constraints, next_state);

          fwd_image =
            BddFsm_get_sins_constrained_forward_image(self->fsm, source_states,
                                                      constraints);

           /* test whether the constrained fwd image is not empty */
          if (!bdd_is_false(dd, fwd_image)) {
            if (0 < BaseTraceExecutor_get_verbosity(executor)) {
              fprintf(BaseTraceExecutor_get_output_stream(executor), "done\n");
            }
            path = cons(NODE_PTR(fwd_image), path);
            ++ count;
          }
          else {
            if (0 < BaseTraceExecutor_get_verbosity(executor)) {
              fprintf(BaseTraceExecutor_get_output_stream(executor),
                      "failed!\n");
            }
            terminate = true;
            success = false;
          }

          /* no longer used bdd refs */
          bdd_free(dd, next_input);
          bdd_free(dd, next_combo);
          bdd_free(dd, last_state);
          bdd_free(dd, next_state);

          bdd_free(dd, source_states);
          source_states = bdd_dup(fwd_image);
        }

        else {
          if (0 == count) {
            fprintf(BaseTraceExecutor_get_error_stream(executor),
                    "Warning: trace has no transitions.\n");
          }
          terminate = true;
        }
      } while (!terminate); /* loop on state/input pairs */
    } /* if has initial state */

    else {
      fprintf(BaseTraceExecutor_get_error_stream(executor),
              "Error: starting state is not initial state.\n");
      success = false;
    }

    /* 3- If last state could be reached a complete trace exists */
    if (success) {
      if (0 < count) {
        res = \
          bdd_partial_trace_executor_generate(self, fwd_image, path,
                                              count, language,
                                              trace_description);
      }

      else { /* generates a complete state of trace of length 0 */
        res = \
          bdd_partial_trace_executor_generate(self, source_states,
                                              Nil, 0, language,
                                              trace_description);
      }

      nusmv_assert(TRACE(NULL) != res);

      /* cleanup */
      walk_dd(dd, bdd_free, path);
      free_list(path);
    }

    bdd_free(dd, source_states);
  }

  /* as a final stage, verify loopbacks consistency using internal
     service. The incomplete trace is compatible (that is, a valid
     completion exists) iff exactly len(Trace) steps have been
     performed *and* loopback data for the incomplete trace applies to
     the complete one as well. */
  if (TRACE(NULL) != res) {
    if (Trace_get_length(trace) == count &&
        partial_trace_executor_check_loopbacks(partial_executor, trace, res)) {

      fprintf(BaseTraceExecutor_get_output_stream(executor),
              "-- Trace was successfully completed.\n");
    }

    else {
      Trace_destroy(res);
      res = TRACE(NULL);
    }
  }

  if (TRACE(NULL) == res) {
    fprintf(BaseTraceExecutor_get_output_stream(executor),
            "-- Trace could not be completed.\n");
  }

  if (NIL(int) != n_steps) { *n_steps = count; }
  return res;
}
Пример #8
0
int Compass_write_sigref(NuSMVEnv_ptr env,
                         BddFsm_ptr fsm,
                         FILE* sigref_file,
                         FILE* prob_file, /* can be NULL */
                         FILE* ap_file, /* can be NULL */
                         Expr_ptr tau, /* can be NULL */
                         boolean do_indent /* Beautify the XML output */
                         )
{
  BddEnc_ptr enc = BddFsm_get_bdd_encoding(fsm);
  DDMgr_ptr dd = BddEnc_get_dd_manager(enc);
  const NodeMgr_ptr nodemgr =
    NODE_MGR(NuSMVEnv_get_value(env, ENV_NODE_MGR));
  const TypeChecker_ptr tc = BaseEnc_get_type_checker(BASE_ENC(enc));

  NodeList_ptr ap_list_add = NODE_LIST(NULL);
  NodeList_ptr probs_list = NULL;
  NodeList_ptr ap_list = NULL;
  int retval = 0;

  add_ptr prob_add;
  add_ptr init_add;
  add_ptr trans_add;
  add_ptr tau_add;
  bdd_ptr bdd_trans;
  bdd_ptr state_mask = NULL;
  bdd_ptr input_mask = NULL;
  bdd_ptr next_state_mask = NULL;
  bdd_ptr next_and_curr_state_mask = NULL;

  /* preprocessing of the parameters */
  /* tau */
  if (EXPR(NULL) != tau) {
    tau = Compile_FlattenSexp(BaseEnc_get_symb_table(BASE_ENC(enc)),
                              car(tau) /* gets rid of SIMPWFF */,
                              Nil);
  }

  /* prob_file */
  if (NULL != prob_file) {
    ParserProb_ptr pl_parser = NULL;

    pl_parser = ParserProb_create(env);
    ParserProb_parse_from_file(pl_parser, prob_file);
    probs_list = ParserProb_get_prob_list(pl_parser);

    if (NODE_LIST(NULL) != probs_list) {
      Compass_check_prob_list(tc, probs_list);
    }

    ParserProb_destroy(pl_parser);
  }

  /* ap_file */
  if (NULL != ap_file) {
    ParserAp_ptr ap_parser = NULL;

    ap_parser = ParserAp_create(env);
    ParserAp_parse_from_file(ap_parser, ap_file);

    ap_list = ParserAp_get_ap_list(ap_parser);

    if (NODE_LIST(NULL) != ap_list) {
      Compass_check_ap_list(tc, ap_list);
    }

    ParserAp_destroy(ap_parser);
  }

  /* collects all required pieces */

  state_mask = BddEnc_get_state_frozen_vars_mask_bdd(enc);
  input_mask = BddEnc_get_input_vars_mask_bdd(enc);
  next_state_mask = BddEnc_state_var_to_next_state_var(enc, state_mask);
  next_and_curr_state_mask = bdd_and(dd, state_mask, next_state_mask);

  { /* calculates the initial states */
    bdd_ptr bdd_init = BddFsm_get_init(fsm);
    bdd_ptr bdd_sinvar = BddFsm_get_state_constraints(fsm);
    bdd_ptr bdd_iinvar = BddFsm_get_input_constraints(fsm);
    bdd_and_accumulate(dd, &bdd_init, bdd_sinvar);
    bdd_and_accumulate(dd, &bdd_init, bdd_iinvar);
    bdd_and_accumulate(dd, &bdd_init, state_mask);

    init_add = bdd_to_add(dd, bdd_init);

    bdd_free(dd, bdd_iinvar);
    bdd_free(dd, bdd_sinvar);
    bdd_free(dd, bdd_init);
  }


  { /* to control dynamic reordering */
    dd_reorderingtype method;
    int dd_reord_status;

    /* Dynamic reordering during monolithic trans can improve performances */
    dd_reord_status = dd_reordering_status(dd, &method);
    dd_autodyn_enable(dd, method);

    { /* calculates the transition relation */
      bdd_ptr bdd_sinvar = BddFsm_get_state_constraints(fsm);
      bdd_ptr bdd_nsinvar = BddEnc_state_var_to_next_state_var(enc, bdd_sinvar);
      bdd_ptr bdd_iinvar = BddFsm_get_input_constraints(fsm);

      bdd_trans = BddFsm_get_monolithic_trans_bdd(fsm);
      bdd_and_accumulate(dd, &bdd_trans, bdd_sinvar);
      bdd_and_accumulate(dd, &bdd_trans, bdd_nsinvar);
      bdd_and_accumulate(dd, &bdd_trans, bdd_iinvar);
      bdd_and_accumulate(dd, &bdd_trans, next_and_curr_state_mask);
      bdd_and_accumulate(dd, &bdd_trans, input_mask);

/* #define DEBUG_TRANS */
#ifdef DEBUG_TRANS
      FILE * p = stdout; // fopen("TRANS.txt", "w");
      fprintf(p, "==================================================\n");
      fprintf(p, "TRANS\n");
      fprintf(p, "==================================================\n");
      // print_trans(enc, bdd_trans, p);
      dd_printminterm(dd, bdd_trans);
      fprintf(p, "==================================================\n");
      dd_printminterm(dd, input_mask);
      fprintf(p, "==================================================\n");
      // fclose(p);
#endif

      trans_add = bdd_to_add(dd, bdd_trans);

      bdd_free(dd, bdd_iinvar);
      bdd_free(dd, bdd_nsinvar);
      bdd_free(dd, bdd_sinvar);
    }

    /* Dynamic reordering is disabled after monolitic
       construction. Later it will be re-enabled if it was enable
       before entering this block */
    dd_autodyn_disable(dd);

    /* probability and tau are optional */
    if (probs_list != NODE_LIST(NULL)) {
      prob_add = Compass_process_prob_list(enc, probs_list, bdd_trans);
    }
    else prob_add = (add_ptr) NULL;

    bdd_free(dd, bdd_trans);

    if (tau != (Expr_ptr) NULL) {
      tau_add = BddEnc_expr_to_add(enc, tau, Nil);

      /* [RC]: This code was disable because it seems masks for input
       * var do not work */
      /* mask_tau_add = BddEnc_apply_input_vars_mask_add(enc, tau_add); */
      /* add_free(dd, tau_add); */
      /* tau_add = mask_tau_add; */
    }
    else
      tau_add = (add_ptr) NULL;

    if (NODE_LIST(NULL) != ap_list) {
      add_ptr expr_add, expr_add_mask;
      ListIter_ptr iter;
      ap_list_add = NodeList_create();

      NODE_LIST_FOREACH(ap_list, iter) {
        node_ptr ap_el = (node_ptr)NodeList_get_elem_at(ap_list, iter);
        node_ptr lab = car(ap_el);
        node_ptr expr = cdr(ap_el);

        expr_add = BddEnc_expr_to_add(enc, expr, Nil);
        expr_add_mask = BddEnc_apply_state_frozen_vars_mask_add(enc, expr_add);
        NodeList_append(ap_list_add, cons(nodemgr, lab, (node_ptr)expr_add_mask));
        add_free(dd, expr_add);
        /* The expr_add_mask will be freed later when the ap_list_add
           will be destroyed */
      }
    }
Пример #9
0
void create_bdds(TransitionSystem *model)
{
//	printf("%d\ttotal states before merge\n", initial_numstates);
//	merge_similar_parents(&PSEUDO_END);
//	merge_similar_children(model->pseudo_initial); //merging children spoiles the calculation of support
	model->states_size = assign_id_and_collect_labels(model, model->pseudo_initial);
//	printf("%d\ttotal states after merge\n", model->states_size);
//	printf("%d\tstates removed\n", initial_numstates - model->states_size);

	get_transitions(model, NULL, model->pseudo_initial);

	init_buddy(model->states_size);

	int state_vars = ceil_of_log2_of(model->states_size);
	int bdd_vars = state_vars * 2;
	bdd_setvarnum(bdd_vars);

	BDD unprimed2primed = bdd_addref(0);
	model->states_bdds = malloc(sizeof(int *) * model->states_size);
	model->states_primed_bdds = malloc(sizeof(int *) * model->states_size);
	model->all_states = bdd_addref(0);

	//encode states as binary functions
	for (int i = 1; i < model->states_size; i++) {
		BDD tmp = bdd_addref(1);
		BDD tmpp = bdd_addref(1);
		for (int j = 0; j < state_vars; j++) {
			int test = (i >> (state_vars - 1 - j)) & 1;
			if (test == 1) {
				tmp = f_bdd_and_with(tmp, bdd_ithvar(j));
				tmpp = f_bdd_and_with(tmpp, bdd_ithvar(j + state_vars));
			} else {
				tmp = f_bdd_and_with(tmp, bdd_nithvar(j));
				tmpp = f_bdd_and_with(tmpp, bdd_nithvar(j + state_vars));
			}
		}
		model->states_bdds[i] = bdd_addref(tmp);
		model->states_primed_bdds[i] = bdd_addref(tmpp);

		model->all_states = f_bdd_or_with(model->all_states, tmp);

		BDD tt = bdd_addref(bdd_and(tmp, tmpp));
		unprimed2primed = f_bdd_or_with(unprimed2primed, tt);
		bdd_delref(tt);
		bdd_delref(tmp);
		bdd_delref(tmpp);
	}
	model->pseudo_end = model->states_bdds[PSEUDO_END.id];
	//remove pseudo end
	BDD tmp = bdd_addref(model->all_states);
	bdd_delref(model->all_states);
	model->all_states = bdd_apply(tmp, model->pseudo_end, bddop_diff);
	bdd_delref(tmp);

	model->unprimed2primed = bdd_addref(unprimed2primed);
	bdd_delref(unprimed2primed);

	//create helper of unprimed and primed variables
	BDD unprimed_vars = bdd_addref(1);
	BDD primed_vars = bdd_addref(1);
	for (int i = 0; i < state_vars; i++) {
		unprimed_vars = f_bdd_and_with(unprimed_vars, bdd_ithvar(i));
		primed_vars = f_bdd_and_with(primed_vars, bdd_ithvar(i + state_vars));
	}
	model->unprimed_vars = unprimed_vars;
	model->primed_vars = primed_vars;

	//create function for transitions
	BDD transitions_bdd = bdd_addref(0);
	for (int i = 0; i < model->transition_size; i++)
	{
//		printf("(%d, %d), ", model->transitions[i]->src, model->transitions[i]->dest);
		BDD tt = bdd_addref(bdd_and(model->states_bdds[model->transitions[i]->src], model->states_primed_bdds[model->transitions[i]->dest]));
		transitions_bdd = f_bdd_or_with(transitions_bdd, tt);
		bdd_delref(tt);
	}
	//transition from end to end to complete Kripke structure
//	BDD tt = bdd_addref(bdd_and(model->states_bdds[PSEUDO_END.id], model->states_primed_bdds[PSEUDO_END.id]));
//	transitions_bdd = f_bdd_or_with(transitions_bdd, tt);
//	bdd_delref(tt);

	model->initial_states = 0;
	State *child;
//	printf("children %d\n", model->pseudo_initial->children_size);
	for (int i = 0; i < model->pseudo_initial->children_size; i++)
	{
		child = model->pseudo_initial->children[i];
		if (child == NULL)
			continue; // removed
		model->initial_states = f_bdd_or_with(model->initial_states, model->states_bdds[child->id]);
	}

	model->transitions_bdd = transitions_bdd;

	for (int i = 0; i < model->activities_size; i++)
	{
		Labels *l = model->labels[i];
		l->states_bdd = bdd_addref(0);
		for (int j = 0; j < l->states_size; j++)
		{
			l->states_bdd = f_bdd_or_with(l->states_bdd, model->states_bdds[l->states[j]]);
		}

	}

}
Пример #10
0
int main (int argc, char** argv)
{
    int argi = init_sysCx (&argc, &argv);
    const int xdomsz = 4;
    int xdoms[3];

    int xfddidcs[3];
    bdd ybdds[3];
    bdd satbdd;
    int off;

    bdd a, b, c, d, e;

    if (argi < argc)  return 1;

    xdoms[0] = xdoms[1] = xdoms[2] = xdomsz;

    bdd_init (1000,100);
    push_losefn_sysCx (bdd_done);

    off = bdd_extvarnum (1);
    satbdd = bdd_ithvar (off);

    xfddidcs[0] = fdd_extdomain (xdoms, 3);
    xfddidcs[1] = xfddidcs[0] + 1;
    xfddidcs[2] = xfddidcs[1] + 1;

    off = bdd_extvarnum (3);
    printf ("y0:%d y1:%d y2:%d\n", off + 0, off + 1, off + 2);
    ybdds[0] = bdd_ithvar (off + 0);
    ybdds[1] = bdd_ithvar (off + 1);
    ybdds[2] = bdd_ithvar (off + 2);

    {
        int cnt = bdd_getnodenum ();
        printf ("Start with %d nodes!\n", cnt);
    }


    d = satbdd;
    {:for (i ; 3)
        a = fdd_equals (xfddidcs[i], xfddidcs[(i+1)%3]);
        a = bdd_addref (a);

        b = bdd_biimp (ybdds[i], ybdds[(i+1)%3]);
        b = bdd_addref (b);

        e = bdd_imp (a, b);
        e = bdd_addref (e);
        bdd_delref (a);
        bdd_delref (b);

        c = d;
        d = bdd_and (c, e);
        d = bdd_addref (d);
        bdd_delref (c);
        bdd_delref (e);
    }

#if 0
    a = bdd_satone (d);
    a = bdd_addref (a);

    fdd_printset (a);
    fputc ('\n', stdout);
    bdd_printset (a);
    fputc ('\n', stdout);
    bdd_delref (a);
#endif

    bdd_printtable (d);
    bdd_delref (d);
        /* fdd_clearall (); */

    {
        int cnt;
        bdd_gbc ();
        cnt = bdd_getnodenum ();
        printf ("Still have %d nodes!\n", cnt);
    }

    lose_sysCx ();
    return 0;
}
Пример #11
0
BDD code_range_bdd(uint32_t low_code,uint32_t high_code) {
   BDD rval,subrange,srx;
   
   if (low_code<0x80)
     rval=bits_range_bdd((low_code<<24),
			 (high_code>=0x80?
			     0x7FFFFFFF:
			     high_code<<24));
   else
     rval=bddfalse;
   
   if ((low_code<0x800) && (high_code>=0x80)) {
      subrange=bits_range_bdd((low_code<0x80?
			       0xC2800000:
			       ((low_code& 0x3F)<<16)+
			       ((low_code&0x7C0)<<18)+
			       0xC0800000),
			      (high_code>=0x800?
				  0xDFBFFFFF:
				  ((high_code& 0x3F)<<16)+
				  ((high_code&0x7C0)<<18)+
				  0xC080FFFF));

      srx=bdd_addref(bdd_and(subrange,bdd_nithvar(9)));
      bdd_delref(subrange);
      subrange=bdd_addref(bdd_and(srx,bdd_ithvar(8)));
      bdd_delref(srx);
      srx=bdd_addref(bdd_or(rval,subrange));
      bdd_delref(rval);
      bdd_delref(subrange);
      rval=srx;
   }

   if ((low_code<0x10000) && (high_code>=0x800)) {
      subrange=bits_range_bdd((low_code<0x800?
			       0xE0A00000:
			       ((low_code&  0x3F)<<8)+
			       ((low_code& 0xFC0)<<10)+
			       ((low_code&0xF000)<<12)+
			       0xE0808000),
			      (high_code>=0x10000?
				  0xEFBFBFFF:
				  ((high_code&  0x3F)<<8)+
				  ((high_code& 0xFC0)<<10)+
				  ((high_code&0xF000)<<12)+
				  0xE08080FF));

      srx=bdd_addref(bdd_and(subrange,bdd_nithvar(17)));
      bdd_delref(subrange);
      subrange=bdd_addref(bdd_and(srx,bdd_ithvar(16)));
      bdd_delref(srx);
      srx=bdd_addref(bdd_and(subrange,bdd_nithvar(9)));
      bdd_delref(subrange);
      subrange=bdd_addref(bdd_and(srx,bdd_ithvar(8)));
      bdd_delref(srx);
      srx=bdd_addref(bdd_or(rval,subrange));
      bdd_delref(rval);
      bdd_delref(subrange);
      rval=srx;
   }

   if (high_code>=0x10000) {
      subrange=bits_range_bdd((low_code<0x10000?
			       0xF0900000:
			       (low_code&     0x3F)+
			       ((low_code&   0xFC0)<<2)+
			       ((low_code& 0x3F000)<<4)+
			       ((low_code&0x1C0000)<<6)+
			       0xF0808080),
			      (high_code&     0x3F)+
			      ((high_code&   0xFC0)<<2)+
			      ((high_code& 0x3F000)<<4)+
			      ((high_code&0x1C0000)<<6)+
			      0xF0808080);
      
      srx=bdd_addref(bdd_and(subrange,bdd_nithvar(25)));
      bdd_delref(subrange);
      subrange=bdd_addref(bdd_and(srx,bdd_ithvar(24)));
      bdd_delref(srx);
      srx=bdd_addref(bdd_and(subrange,bdd_nithvar(17)));
      bdd_delref(subrange);
      subrange=bdd_addref(bdd_and(srx,bdd_ithvar(16)));
      bdd_delref(srx);
      srx=bdd_addref(bdd_and(subrange,bdd_nithvar(9)));
      bdd_delref(subrange);
      subrange=bdd_addref(bdd_and(srx,bdd_ithvar(8)));
      bdd_delref(srx);
      srx=bdd_addref(bdd_or(rval,subrange));
      bdd_delref(rval);
      bdd_delref(subrange);
      rval=srx;
   }
   
   return rval;
}