Example #1
0
int NodeInfo::free_coord(OrthoDir s_main, OrthoDir s_to) 
{ 
  int result = coord(s_main);
  int offset;
  switch (s_main)
  {
      case odNorth: offset = flips(odNorth, s_to)*delta(s_to, odNorth);
      case odSouth: offset = flips(odSouth, s_to)*delta(s_to, odSouth);
      case odWest: offset = flips(odWest, s_to)*delta(s_to, odWest);
      case odEast: offset = -flips(odEast, s_to)*delta(s_to, odEast);
	  OGDF_NODEFAULT
  }//switch
            
  result = result + offset;
  return result;
}//freecoord
Example #2
0
static void testLastFlipCounts(int sq, u64 mover) {
	mover &= ~mask(sq);
	const u64 enemy = ~(mover | mask(sq));

	int expected = lastFlipCount(sq, mover);
	u64 flip = flips(sq, mover, enemy);
	u64 actual = bitCount(flip);
	if (actual!=expected) {
		std::cout << "lastFlipCount error\n";
		std::cout << "lastFlipCount : " << expected << "\n";
		std::cout << "flips : (" << bitCount(flip) << ")\n";
		printBitBoard(flip);
		std::cout << "\nboard : (* to move)\n";
		printBoard(mover, enemy);
		std::cout << "\n";
		std::cout << "enemy : " << asHex(enemy) << "\n";
		std::cout << "square : " << squareText(sq) << " (" << sq << ")" << std::endl;
	}
	assertHexEquals(expected, actual);
}
Example #3
0
static void testFlips(int sq, u64 mover, u64 enemy) {
	u64 m = mask(sq);
	mover&=~m;
	enemy&=~m;

	u64 expected = slowFlips(sq, mover, enemy);
	u64 actual = flips(sq, mover, enemy);
	if (expected!=actual) {
		printBoard(mover, enemy);
		std::cout << "Flips from " << squareText(sq) << "\n";
	}
	assertHexEquals(expected, actual);

	u64 ks = koggeStoneFlips(sq, mover, enemy);
	if (expected!=ks) {
		printBoard(mover, enemy);
		std::cout << "Flips from " << squareText(sq) << "\n";
	}
	assertHexEquals(expected, ks);
}
Example #4
0
static void testFlipFlips() {
	assertHexEquals(0, flips(0, 0, ~1ULL));
	assertHexEquals(0x2, flips(0, 0x4, ~0x5ULL));
	assertHexEquals(0x100, flips(0, 0x10000, ~0x10001ULL));
	assertHexEquals(0x200, flips(0, 0x40000, ~0x40001ULL));

	assertHexEquals(0, flips(63, 0, ~mask(63)));
	assertHexEquals(mask(62), flips(63, mask(61), ~(mask(61)|mask(63))));
	assertHexEquals(mask(55), flips(63, mask(47), ~(mask(47)|mask(63))));
	assertHexEquals(mask(54), flips(63, mask(45), ~(mask(45)|mask(63))));

	assertHexEquals(0, flips(7, 0, ~mask(7)));
	assertHexEquals(mask(6), flips(7, mask(5), ~(mask(7)|mask(5))));
	assertHexEquals(mask(14), flips(7, mask(21), ~(mask(7)|mask(21))));
	assertHexEquals(mask(15), flips(7, mask(23), ~(mask(7)|mask(23))));

	assertHexEquals(0x0070000000000000, flips(61, 0xd68dad1b5a36751f, 0x97252e4a5c98ae0));
	assertHexEquals(0x40ULL<<7*8, flips(63, 0x3FFFFFFFFFFFFFFF, 0x40ULL<<7*8));
	assertHexEquals(0, flips(48, 0x5796af2d5e5a751f,0xa86850d2a1258ae0));
	assertHexEquals(0, flips(57, 0x010a5880126a3d44, 0x1cf0862fa4118029));
}
Example #5
0
int latim_pp_open (struct inode *inode, struct file *filep) {

        unsigned long spin_temp;
        int try_run, try_freeze;

        do_gettimeofday(&latim_pp_o);

        printk (KERN_WARNING "%s:%s - open request from %i\n",
                HERE, current->pid);

        /*
         *    mutex checkpoint to block a second open request
         */

        if (down_interruptible (&latim_pp_device_available) != 0) {
                printk (KERN_WARNING "%s:%s - request for %i interrupted\n",
                        HERE, current->pid);
                return -EINTR;
        }

        printk (KERN_WARNING "%s:%s - device opened for %i\n",
                HERE, current->pid);

        /*
         *    allocate circular buffer memory
         */

        if (!(irq_unibuf = vmalloc(buffer_size * SLOT))) {
                DOUBLE_LOG ("%s:%s - failed to allocate buffer\n", HERE);
                up (&latim_pp_device_available);
                return -ENOMEM;
        } 

        /*
         *    check for an external counter on data lines of PP
         *    and prepare freeze codes
         */

        pp_count_run = 1 << (read_bit - 1);
        pp_count_freeze = 0;
        try_run = flips(pp_count_run);
        try_freeze = flips(0);

        if (try_freeze == 0 && try_run > 0) {
                DOUBLE_LOG ("%s:%s - counter found with run mask: %x\n",
                            HERE, pp_count_run);
        } else if (try_freeze > 0 && try_run == 0) {
                pp_count_freeze = pp_count_run;
                pp_count_run = 0;
                DOUBLE_LOG ("%s:%s - counter found with freeze mask: %x\n",
                            HERE, pp_count_freeze);
        } else if (try_freeze == 0 && try_run == 0) {
                DOUBLE_LOG ("%s:%s - no external counter detected\n", HERE);
                //    pp_count_run = 0;
        } else if ((try_freeze < 0) ^ (try_run < 0)) {
                DOUBLE_LOG ("%s:%s - %s\n", HERE,
                            "External counter found, but PP is write only");
        } else {
                DOUBLE_LOG ("%s:%s - could not freeze the external counter\n",
                            HERE);
                //    pp_count_run = 0;
        }
        pp_counter = pp_count_run || pp_count_freeze;
    
        spin_lock_irqsave (&irq_lock, spin_temp);

        irq_write_pointer = 0;
        irq_read_pointer = 0;
        irq_awake_in = 0;
        irq_buffer_count = 0;
        irq_buffer_size = buffer_size;
        ready_to_read = 0;
        irq_action = Go_Process;
        outb(pp_count_run | PIRQ_ENABLE, base+2);   /* interrupt line enable */

        spin_unlock_irqrestore (&irq_lock, spin_temp);

        return 0;
}