From ef32994167504e225ca002e40dbe5eddb5253d1b Mon Sep 17 00:00:00 2001 From: Pepping <pepping> Date: Tue, 2 Jun 2015 16:35:31 +0000 Subject: [PATCH] Initial commit --- tools/oneclick/base/vhdl.py | 382 ++++++++++++++++++++++++++++++++++++ 1 file changed, 382 insertions(+) create mode 100644 tools/oneclick/base/vhdl.py diff --git a/tools/oneclick/base/vhdl.py b/tools/oneclick/base/vhdl.py new file mode 100644 index 0000000000..3658294c67 --- /dev/null +++ b/tools/oneclick/base/vhdl.py @@ -0,0 +1,382 @@ +############################################################################### +# +# 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.architectures = [] + + 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_string(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_string(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" + + return s_return + + def make_entity_definition_string(self, indend = 0): + return self.apply_indend(self.make_definition_string("ENTITY"), indend) + "\n" + + def make_component_definition_string(self, indend = 0): + return self.apply_indend(self.make_definition_string("COMPONENT"), indend) + "\n" + + 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" + + def add_architecture(self, archName = "str"): + self.architectures.append(Architecture(archName, self.name)) + + +class Architecture: + + def __init__(self, archName = "", entityName =""): + """ + """ + self.archName = archName + self.entityName = entityName + self.constants = [] + self.signals = [] + self.components = [] + self.longestConstantName = 0 + self.longestConstantType = 0 + self.longestSignalName = 0 + self.longestSignalType = 0 + + def add_constant(self, name, type, value = ""): + newConstant = Constant(name, type, value) + self.constants.append(newConstant) + + def add_signal(self, name, type, default = ""): + newSignal = Signl(name, type, default) + self.signals.append(newSignal) + + def add_component(self, entity): + self.components.append(entity) + + def make_arch_header_string(self): + + if self.constants: + self.set_longest_constant_name() + self.set_longest_constant_type() + if self.signals: + self.set_longest_signal_name() + self.set_longest_signal_type() + + # Create start + s_return = "ARCHITECTURE " + self.archName +" OF " + self.entityName + " IS\n\n" + + for i in range(len(self.constants)): + s_constant = " CONSTANT " + self.constants[i].name.ljust(self.longestConstantName) + " : " + self.constants[i].type.ljust(self.longestConstantType) + " := " + self.constants[i].value + ";\n" + s_return = s_return + s_constant + s_return = s_return + "\n" + + for i in range(len(self.signals)): + s_signal = " SIGNAL " + self.signals[i].name.ljust(self.longestSignalName) + " : " + self.signals[i].type.ljust(self.longestSignalType) + if(self.signals[i].default != ""): + s_signal = s_signal + " := " + self.signals[i].default + s_signal = s_signal + ";\n" + s_return = s_return + s_signal + s_return = s_return + "\n" + + for i in self.components: + s_component = i.make_component_definition_string(indend = 2) + s_return = s_return + s_component + + return s_return + + def set_longest_constant_name(self): + constantNames = [] + for i in range(len(self.constants)): + constantNames.append(self.constants[i].name) + self.longestConstantName = len(max(constantNames, key=len)) + + def set_longest_constant_type(self): + constantTypes = [] + for i in range(len(self.constants)): + constantTypes.append(self.constants[i].type) + self.longestConstantType = len(max(constantTypes, key=len)) + + def set_longest_signal_name(self): + signalNames = [] + for i in range(len(self.signals)): + signalNames.append(self.signals[i].name) + self.longestSignalName = len(max(signalNames, key=len)) + + def set_longest_signal_type(self): + signalTypes = [] + for i in range(len(self.signals)): + signalTypes.append(self.signals[i].type) + self.longestSignalType = len(max(signalTypes, key=len)) + + \ No newline at end of file -- GitLab