Files
DRAMSys/dram/static/stlGenerator.py
2014-03-21 13:46:38 +01:00

121 lines
4.4 KiB
Python

import xml.etree.ElementTree as ET
import re
import sys
import os
class DramConfigReader:
maxValues = {}
startBits = {}
endBits = {}
def __extractAdressEncoding(self, root, elementName):
rowElement = root[0].find(elementName)
rowBitFrom, rowBitsTo = int(
rowElement.attrib['from']), int(rowElement.attrib['to'])
rowBitRange = rowBitsTo - rowBitFrom + 1
maxRow = 2 ** rowBitRange - 1
#print('{0}: range {1}..{2}'.format(elementName, 0, maxRow))
self.startBits[elementName] = rowBitFrom
self.endBits[elementName] = rowBitsTo
self.maxValues[elementName] = maxRow
def __init__(self):
root = ET.parse(
os.path.dirname(os.path.realpath(sys.argv[0])) + '/addressConfig.xml').getroot()
self.__extractAdressEncoding(root, 'channel')
self.__extractAdressEncoding(root, 'bank')
self.__extractAdressEncoding(root, 'row')
self.__extractAdressEncoding(root, 'colum')
class StlReader:
__dramConfigReader = DramConfigReader()
def onesMask(self, numberOfOnes):
result = 0
for i in range(numberOfOnes):
result = result | 1 << i
return result
def parseAttributeFromAddress(self, address, element):
return address >> self.__dramConfigReader.startBits[element] & self.onesMask(self.__dramConfigReader.endBits[element] - self.__dramConfigReader.startBits[element] + 1)
def formatStlLine(self, line):
try:
found = re.search('0x[0-9,a-f]+', line).group(0)
address = int(found, 16)
decodedAddress = '[Channel: {0} Bank: {1} Row:{2} Column: {3}]'.format(self.parseAttributeFromAddress(address, 'channel'),
self.parseAttributeFromAddress(address, 'bank'), self.parseAttributeFromAddress(address, 'row'), self.parseAttributeFromAddress(address, 'colum'))
return line.replace("\n", " ") + decodedAddress
except AttributeError:
return ''
def printStlPretty(self, filename):
f = open(filename)
for line in f.readlines():
print(self.formatStlLine(line))
class StlGenerator:
__actions = []
__time = 0
__dramConfigReader = DramConfigReader()
def clear(self):
self.__actions = []
self.__time = 0
def setTime(self, time):
self.__time = time
def addAction(self, bank, row, channel=0, RD_WR='read'):
tupel = (self.__time, RD_WR, self.__generateAdress(channel, bank, row))
self.__actions.append(tupel)
def setTimeAndAddAction(self, time, bank, row, channel=0, RD_WR='read'):
self.setTime(self, time)
self.addAction(self, bank, row, channel, RD_WR)
def addLoad(self, banks, rows, channel=0, RD_WR='read'):
for bank in banks:
for row in rows:
self.addAction(bank, row, channel, RD_WR)
def setTimeAndAddLoad(self, time, banks, rows, channel=0, RD_WR='read'):
self.setTime(self, time)
self.addLoad(banks, rows, channel, RD_WR)
def generateStl(self, filename):
f = open(filename, 'w')
tmp = []
for tupel in self.__actions:
tmp.append('{0}: {1} {2:#x}'.format(tupel[0], tupel[1], tupel[2]))
result = '\n'.join(tmp)
f.write(result)
f.close()
print(
'<---------------------- Generated stl {0} ---------------------->'.format(filename))
print(result)
print(
'<---------------------- End generated stl ---------------------->'.format(filename))
def __generateAdress(self, channel, bank, row):
if(channel > self.__dramConfigReader.maxValues['channel']):
raise(BaseException('Channel argument out of range'))
if(bank > self.__dramConfigReader.maxValues['bank']):
raise(BaseException('Bank argument out of range'))
if(row > self.__dramConfigReader.maxValues['row']):
raise(BaseException('Row argument out of range'))
return (channel << self.__dramConfigReader.startBits['channel']) | (bank << self.__dramConfigReader.startBits['bank']) | (row << self.__dramConfigReader.startBits['row'])
def __init__(self):
pass
if __name__ == '__main__':
if(len(sys.argv) > 1):
stlReader = StlReader()
for line in sys.argv[1:]:
stlReader.printStlPretty(line)