#!/usr/bin/env python2

import numpy as np


idx = {'i' : 0, 'ct0' : 1, 'ct1' : 2, 'key_state' : 3, 'key_press' : 4}
x = np.zeros(len(idx), dtype=np.uint8)

def mybin(b):
	bs = bin(b)[2:]
	rs = 8 - len(bs)
	return rs * '0' + bs
	
def print_x(s='', KEY_PIN=None):
	i = x[idx['i']]
	ct0 = x[idx['ct0']]
	ct1 = x[idx['ct1']]
	key_state = x[idx['key_state']]
	key_press = x[idx['key_press']]
	if KEY_PIN is not None:
		KPS = mybin(KEY_PIN)
	else:
		KPS = ''
	print '%-28s  %-9s   %-9s   %-9s   %-9s   %-9s   %-9s' % (s, KPS, mybin(i), mybin(ct0), mybin(ct1), mybin(key_state), mybin(key_press))
		
print '%-28s  %-9s   %-9s   %-9s   %-9s   %-9s   %-9s' % ('', 'KEY_PIN', 'i', 'ct0', 'ct1', 'key_state', 'key_press')
print_x('initial values')

def intcall(KEY_PIN):
	s = "i = key_state ^ ~KEY_PIN"
	x[idx['i']] = x[idx['key_state']] ^ ~ KEY_PIN
	print_x(s, KEY_PIN)
	
	s = "ct0 = ~(ct0 & i)"
	x[idx['ct0']] = ~(x[idx['ct0']] & x[idx['i']])
	print_x(s, KEY_PIN)
	
	s = "ct1 = ct0 ^ (ct1 & i)"
	x[idx['ct1']] = x[idx['ct0']] ^ (x[idx['ct1']] & x[idx['i']])
	print_x(s, KEY_PIN)
	
	s = "i &= ct0 & ct1"
	x[idx['i']] = x[idx['i']] & x[idx['ct0']] & x[idx['ct1']]
	print_x(s, KEY_PIN)
	
	s = "key_state ^= i"
	x[idx['key_state']] = x[idx['key_state']] ^ x[idx['i']]
	print_x(s, KEY_PIN)
	
	s = "key_press |= key_state & i"
	x[idx['key_press']] = x[idx['key_press']] | (x[idx['key_state']] & x[idx['i']])
	print_x(s, KEY_PIN)
	print '---intcall end -----------------'
	
intcall(0xFF)
intcall(0xFF)
intcall(0xFF)
intcall(0xFe)
intcall(0xFe)
intcall(0xFe)
intcall(0xFe)
intcall(0xFe)
intcall(0xFe)
intcall(0xFe)
intcall(0xFe)
intcall(0xFF)
intcall(0xFF)
intcall(0xFF)
intcall(0xFF)
intcall(0xFF)
intcall(0xFF)
intcall(0xFF)
intcall(0xFF)


