Commit 433d4253 authored by Ari Viinikainen's avatar Ari Viinikainen
Browse files

Lisätty testaaHDL.py, jolla voi testatan HDL tiedoston sisällön...

Lisätty testaaHDL.py, jolla voi testatan HDL tiedoston sisällön oikeellisuudeen. Toimii Not.hdl, And.hdl ja Or.hdl. Toimisi muillekin, ehkä joskus lisään muita, mutta silloin esim. ALU.hdl:ää varten pitäisi muuttaa siten ettei käydä kaikkia totuustaulun rivejä läpi, vaan annetaan testitapaukset.
parent b07ee485
// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/01/And.hdl
/**
* And gate: out = 1 if {a==1 and b==1}, 0 otherwise
* And gate: if {a==1 and b==1} then out = 1 else out = 0
*/
CHIP And {
IN a, b;
OUT out;
PARTS:
// Put your code here:
//Nand(a=a, b=b, out=nandout);
//Nand(a=nandout, b=nandout, out=out);
Nand(a=a, b=b, out=out2);
Nand(a=out2, b=out2, out=out3);
Nand(a=out3, b=out3, out=out4);
Nand(a=out4, b=out4, out=out);
}
// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/01/Not.hdl
/**
* Not gate: out = not in
*/
CHIP Not {
IN in;
OUT out;
PARTS:
// Put your code here:
Nand(a=in, b=in, out=out); // kommentti
}
\ No newline at end of file
// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/01/Or.hdl
// Juuso Hassi
/**
* Or gate:
* out = 1 if (a == 1 or b == 1)
* 0 otherwise
*/
CHIP Or {
IN a, b;
OUT out;
PARTS:
//Käännetään molemmat kielteisiksi niin saadaan nandilla vastaus.
Nand(a=a, b=a, out=out1);
Nand(a=b, b=b, out=out2);
Nand(a=out1, b=out2, out=out);
}
# -*- 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())
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment