testaaHDL.py 4.69 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# -*- coding:utf-8; -*-

def Nand(a, b): 
    return not(a and b)

def comment_remover(text):
    import re
    def replacer(match):
        s = match.group(0)
        if s.startswith('/'):
            return " " # note: a space and not an empty string
        else:
            return s
    pattern = re.compile(
        r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"',
        re.DOTALL | re.MULTILINE
    )
    return re.sub(pattern, replacer, text)	

def testaa(testi, chip, parametrit):
	oikeat = {'Not': 'not a', 'And': 'a and b', 'Or': 'a or b'}
	oikea = oikeat[chip]
	import itertools
	# muutetaan pythonin varattu sana 
	param = ['a' if x=='in' else x for x in parametrit]
	testi = testi.replace('in','a')
	oikea = oikea.replace('in','a')
	parametreja = len(param)
	products = itertools.product((False, True), repeat=parametreja)
	tt = list(products)
	kieli = 'fi'
	virheet = ''
	for x in tt:
		for i in range(parametreja):
			ss = param[i] + ' = ' + str(x[i])
			exec(ss)
		oikeaValue = eval(oikea)
		testiValue = eval(testi)
		if (oikeaValue != testiValue):
			arvot = ' '.join(map(str, x))
			# muutetaan True, False tuple 1 0 stringiksi
			rivi = ' '.join([str(int(eval(x))) for x in (arvot.split(' '))])
			virheet += rivi + ' ' + '  ' + str(int(oikeaValue)) + '      ' + str(int(testiValue)) + '\n'
	if virheet != '':
		eTT1 = {'fi': "totuustaulu poikkeaa oikeasta\n\n", 'en': "differs from the correct truth table\n\n"}
		eTT2 = {'fi': " oikea vastaus\n", 'en': " correct answer\n"}
		virheet = eTT1[kieli] + ' '.join(parametrit) + eTT2[kieli] + virheet
		print(virheet)
	else:
		print('Testaamasi ' + chip + ' on oikein!')

def testaaRegex(myregex, myreplace, s):
	import re
	test = re.sub(myregex, myreplace, s)
	#print(test)
	if test == s:
		return test
	else:
		return testaaRegex(myregex, myreplace, test)

def testaaTiedosto(hdl):
	hdl = comment_remover(hdl)
	hdl = " ".join(hdl.split())
	#print(hdl)
	import re
	result = re.search('CHIP (.*) {(.*)', hdl)
	if result == None:
		print('CHIP sana tai { -sulku puuttuu')
		exit()
	chip = result.group(1)
	sisalto = re.findall("\{(.*?)\}", hdl)
	if sisalto == []:
		print('} -sulku puuttuu')
		exit()

	osat = sisalto[0].split('PARTS:')
	if len(osat) != 2:
		print('PARTS: -määritys puuttuu')
		exit()

	testaaSulut = "".join(osat[1].split())
	if testaaSulut.count('(') != testaaSulut.count(');'):
		print('Toteutuksesta puuttuu sulkuja tai ; -merkkejä.')
		exit()
	
	res1 = re.search('IN (.*);(.*)OUT (.*);(.*)', osat[0].rstrip().lstrip())
	if res1 == None:
		print('IN tai OUT muuttuja tai niiden rivin lopussa oleva ; -merkki puuttuu')
		exit()
	inputit = res1.group(1).split(',')
	outputit = res1.group(3).split(',')
	inputit = [x.strip(' ') for x in inputit]
	outputit = [x.strip(' ') for x in outputit]
	yhtalo = osat[1].lstrip().rstrip()
	testout = ['=' + s + ');' for s in outputit]
	testin = ['=' + s + ',' for s in inputit]
	if not all(o in "".join(yhtalo.split()) for o in testout):
		print('Chipin (kaikkia) ulostuloja ' + str(outputit) + ' ei ole kytketty')
		exit()
	if not all(i in "".join(yhtalo.split()) for i in testin):
		print('Chipin (kaikkia) sisäänmenoja ' + str(inputit) + ' ei ole kytketty')
		exit()

	palat = {}
	osaset = yhtalo.split(';')
	osaset = filter(None, osaset)
	osaset = [x.strip(' ') for x in osaset]
	ulostulo = [x for x in osaset if re.search('[ (,]out=out[),]', x)]
	#print(ulostulo)
	muut =  [x for x in osaset if not re.search('[ (,]out=out[),]', x)]
	#print('muut: ' + str(muut))
	for i in range(len(muut)):
		#print(','.join(muut[i].split(',')[:-1])+')')
		#print(''.join(muut[i].split(',')[-1].split('=')[1])[:-1])
		lause = ','.join(muut[i].split(',')[:-1])+')'
		lause = lause.replace('a=','')
		lause = lause.replace('b=','')
		palat[''.join(muut[i].split(',')[-1].split('=')[1])[:-1]] = ''.join(lause.split())
#	print(palat)
	ulostulo = ','.join(ulostulo[0].split(',')[:-1])+')'
	#print(ulostulo)
	if 'a=' in ulostulo and 'b=' in ulostulo:
		ulostulo = ulostulo.replace('a=','')
		ulostulo = ulostulo.replace('b=','')

	ulostulo = ''.join(ulostulo.split())

	while bool(palat):
		for key, value in list(palat.items()):
			myregex = '([(,])' + key + '([),])'
			myreplace =  r'\1' + palat[key] + r'\2'
			ulostulotest = testaaRegex(myregex, myreplace, ulostulo)
			if ulostulotest != ulostulo:
				del palat[key]
				ulostulo = ulostulotest
	#print(ulostulo)
	testaa(ulostulo, chip, inputit)

'''
# Näillä voi testata TIM:in ulkopuolella	
def avaaTiedosto(tiedosto):
	f = open(tiedosto, 'r')
	return f.read()

# Testaa suoraan tiedostosta
testaaTiedosto(avaaTiedosto('Not.hdl'))
testaaTiedosto(avaaTiedosto('And.hdl'))
testaaTiedosto(avaaTiedosto('Or.hdl'))
'''

# Testaus TIM:ssä
if __name__ == '__main__':
	import sys
	testaaTiedosto(open(sys.argv[1], 'r').read())