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
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); }
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); }
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)); }
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; }