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