Skip to content
Snippets Groups Projects
Commit 21588897 authored by Pepping's avatar Pepping
Browse files

Replaced by vhdl.py

parent bdb7ce2f
Branches
No related tags found
No related merge requests found
###############################################################################
#
# Copyright (C) 2014
# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
"""
"""
import common as cm
import common_dict_file
import sys
import os
import os.path
import shutil
dirList = ["IN", "in", "OUT", "out", "INOUT", "inout"]
class Port:
def __init__(self, name, dir, type, default=""):
self.name = name
if dir in dirList:
self.dir = dir
else:
print """Not a valid dir type. Should be "IN", "OUT" or "INOUT" """
self.type = type
self.default = default
def setPortDir(self, newDir):
self.dir = newDir
class Generic:
def __init__(self, name, type, default=""):
self.name = name
self.type = type
self.default = default
class Constant:
def __init__(self, name, type, value=""):
self.name = name
self.type = type
self.value = value
class Signl:
def __init__(self, name, type, default=""):
self.name = name
self.type = type
self.default = default
class Entity:
s_port_start = " PORT (\n"
s_port_map_start = " PORT MAP(\n"
s_generic_start = " GENERIC (\n"
s_generic_map_start = " GENERIC MAP(\n"
def __init__(self, name = ""):
"""
"""
self.name = name
self.generics = []
self.ports = []
self.portNames = []
self.longestPortName = 15
self.longestPortDir = 3
self.genericNames = []
self.genericTypes = []
self.longestGenericName = 15
self.longestGenericType = 8
self.architecture = []
def read_entity_from_file(self, path, name):
fname = path + name + ".vhd"
if not(os.path.isfile(fname)): sys.exit('Error : Specified VHD file does not exist: ' + fname)
f = file(fname, "r")
s = ""
s = f.readline()
# Read the entity name
while not(('ENTITY ' in s) or ('entity ' in s)):
s = f.readline()
self.name = s.split(" ")[1]
s = f.readline()
# Find the start of the generic definitions
if('generic' in s) or ('GENERIC' in s):
while not(');') in s:
s = f.readline()
if not(self.comment_or_empty(s)):
if ');' in s:
s = f.readline()
break
s = self.remove_added_comment(s)
s_comp = s.split(": ")
newGenericName = s_comp[0].strip()
# Check if a default value is assigned
if(":=" in s_comp[1]):
s_comp1 = s_comp[1].split(":=")
newGenericDefault = (s_comp1[1].strip(";")).strip()
s_type = s_comp1[0]
else:
newGenericDefault = ""
s_type = s_comp[1]
newGenericType = (s_type.strip(";")).strip()
newGeneric = Generic(newGenericName, newGenericType, newGenericDefault)
self.generics.append(newGeneric)
if('port' in s) or ('PORT' in s):
while not('end entity ') in s:
s = f.readline()
if not(self.comment_or_empty(s)):
if s.strip() == ');':
break
s = self.remove_added_comment(s)
s_comp = s.split(": ")
newPortName = s_comp[0].strip()
# Check if a default value is assigned
if(":=" in s_comp[1]):
s_comp1 = s_comp[1].split(":=")
newPortDefault = (s_comp1[1].strip(";")).strip()
s_dir_type = s_comp1[0]
else:
newPortDefault = ""
s_dir_type = s_comp[1]
newPortDir = s_dir_type.split(" ", 1)[0]
newPortType = ((s_dir_type.split(" ", 1)[1]).strip(";")).strip()
self.add_port(newPortName, newPortDir, newPortType, newPortDefault)
f.close()
def comment_or_empty(self, s):
s_strip = s.strip()
return (s_strip.startswith("--") or not(s.strip()))
def remove_added_comment(self, s):
i = s.find('--')
if i != -1:
s = s[0:i] + "\n"
return s.strip()
def make_instantiation(self, connect=True):
if self.generics:
self.set_longest_generic_name()
self.set_longest_generic_type()
if self.ports:
self.set_longest_port_name()
self.set_longest_port_dir()
# Create start
s_return = "u_inst_" + self.name + " : ENTITY work." + self.name + "\n"
for i in range(len(self.generics)):
if(i == 0):
s_return = s_return + self.s_generic_map_start
s_generic = " " + self.generics[i].name.ljust(self.longestGenericName) + " => "
if(connect):
s_generic = s_generic + self.generics[i].name
if(i != len(self.generics)-1):
s_generic = s_generic + ",\n"
else:
s_generic = s_generic + "\n )\n"
s_return = s_return + s_generic
for i in range(len(self.ports)):
if(i == 0):
s_return = s_return + self.s_port_map_start
s_port = " " + self.ports[i].name.ljust(self.longestPortName) + " => "
if(connect):
s_port = s_port + self.ports[i].name
if(i != len(self.ports)-1):
s_port = s_port + ",\n"
else:
s_port = s_port + "\n );\n"
s_return = s_return + s_port
return s_return
def make_definition(self, inst_type="ENTITY"):
if self.generics:
self.set_longest_generic_name()
self.set_longest_generic_type()
if self.ports:
self.set_longest_port_name()
self.set_longest_port_dir()
# Create start
s_return = inst_type + " " + self.name +" IS\n"
for i in range(len(self.generics)):
if(i == 0):
s_return = s_return + self.s_generic_start
s_generic = " " + self.generics[i].name.ljust(self.longestGenericName) + " : " + self.generics[i].type.ljust(self.longestGenericType)
if(self.generics[i].default != ""):
s_generic = s_generic + " := " + self.generics[i].default
if(i != len(self.generics)-1):
s_generic = s_generic + ";\n"
else:
s_generic = s_generic + "\n );\n"
s_return = s_return + s_generic
for i in range(len(self.ports)):
if(i == 0):
s_return = s_return + self.s_port_start
s_port = " " + self.ports[i].name.ljust(self.longestPortName) + " : " + self.ports[i].dir.ljust(self.longestPortDir) + " " + self.ports[i].type
if(self.ports[i].default != ""):
s_port = s_port + " := " + self.ports[i].default
if(i != len(self.ports)-1):
s_port = s_port + ";\n"
else:
s_port = s_port + "\n );\n"
s_return = s_return + s_port
s_return = s_return + "END " + inst_type + " " + self.name + ";\n\n"
return s_return
def make_entity_definition(self, indend = 0):
return self.apply_indend(self.make_definition("ENTITY"), indend)
def make_component_definition(self, indend = 0):
return self.apply_indend(self.make_definition("COMPONENT"), indend)
def apply_indend(self, s, indend):
s_indend = ""
for i in range(indend):
s_indend = s_indend + " "
s_return =s_indend + s.replace('\n', '\n' + s_indend)
return (s_return)
def comment(self, s):
s_return ="-- " + s.replace('\n', '\n' + "-- ") + '\n'
return (s_return)
def set_longest_port_name(self):
self.portNames = []
for i in range(len(self.ports)):
self.portNames.append(self.ports[i].name)
self.longestPortName = len(max(self.portNames, key=len))
def set_longest_port_dir(self):
self.longestPortDir = 0
for i in range(len(self.ports)):
if(len(self.ports[i].dir) > self.longestPortDir):
self.longestPortDir = len(self.ports[i].dir)
def set_longest_generic_name(self):
self.genericNames = []
for i in range(len(self.generics)):
self.genericNames.append(self.generics[i].name)
self.longestGenericName = len(max(self.genericNames, key=len))
def set_longest_generic_type(self):
self.genericTypes = []
for i in range(len(self.generics)):
self.genericTypes.append(self.generics[i].type)
self.longestGenericType = len(max(self.genericTypes, key=len))
def add_port(self, name, dir, type, default = ""):
newPort = Port(name, dir, type, default)
self.ports.append(newPort)
def add_generic(self, name, type, default = ""):
newGeneric = Generic(name, type, default)
self.generics.append(newGeneric)
def replace_std_logic_vector_with_std_logic(self):
for i in self.ports:
if i.type == "std_logic_vector(0 downto 0)":
i.type = "std_logic"
elif i.type == "STD_LOGIC_VECTOR(0 DOWNTO 0)":
i.type = "STD_LOGIC"
class Architecture:
def __init__(self, name = ""):
"""
"""
self.name = name
self.constants = []
self.signals = []
self.components = []
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment