summaryrefslogtreecommitdiff
path: root/src/model_generation.py
diff options
context:
space:
mode:
authorrahulp132020-02-20 15:19:54 +0530
committerrahulp132020-02-20 15:19:54 +0530
commit5deac9027a851c497c6aebfb9b74c491b598e944 (patch)
tree2ac8b8adf77b2a0dabc788beddaf50c99236458c /src/model_generation.py
parent4245ac1c7a4ef6a4e650ab666327210f2c812e3e (diff)
downloadnghdl-5deac9027a851c497c6aebfb9b74c491b598e944.tar.gz
nghdl-5deac9027a851c497c6aebfb9b74c491b598e944.tar.bz2
nghdl-5deac9027a851c497c6aebfb9b74c491b598e944.zip
restructured code - pyinstaller
Diffstat (limited to 'src/model_generation.py')
-rw-r--r--src/model_generation.py1976
1 files changed, 999 insertions, 977 deletions
diff --git a/src/model_generation.py b/src/model_generation.py
index 445143b..dd6eea2 100644
--- a/src/model_generation.py
+++ b/src/model_generation.py
@@ -1,1010 +1,1032 @@
#!/usr/bin/python3
import re
-import sys
import os
-# Script start from here
-print("Arguement is :", sys.argv[1])
-fname = os.path.basename(sys.argv[1])
-print("VHDL filename is :", fname)
-home = os.path.expanduser("~")
-
-# #### Creating connection_info.txt file from vhdl file #### #
-read_vhdl = open(sys.argv[1], 'r')
-vhdl_data = read_vhdl.readlines()
-read_vhdl.close()
-
-start_flag = -1 # Used for scaning part of data
-scan_data = []
-# p=re.search('port(.*?)end',read_vhdl,re.M|re.I|re.DOTALL).group()
-
-for item in vhdl_data:
- if re.search('port', item, re.I):
- start_flag = 1
-
- elif re.search("end", item, re.I):
- start_flag = 0
-
- if start_flag == 1:
- item = re.sub("port", " ", item, flags=re.I)
- item = re.sub("\(", " ", item, flags=re.I) # noqa
- item = re.sub("\)", " ", item, flags=re.I) # noqa
- item = re.sub(";", " ", item, flags=re.I)
-
- scan_data.append(item.rstrip())
- scan_data = [_f for _f in scan_data if _f]
- elif start_flag == 0:
- break
-
-port_info = []
-port_vector_info = []
-
-for item in scan_data:
- print("Scan Data :", item)
- if re.search("in", item, flags=re.I):
- if re.search("std_logic_vector", item, flags=re.I):
- temp = re.compile(r"\s*std_logic_vector\s*", flags=re.I)
- elif re.search("std_logic", item, flags=re.I):
- temp = re.compile(r"\s*std_logic\s*", flags=re.I)
- else:
- print("Please check your vhdl code for datatype of input port")
- sys.exit()
- elif re.search("out", item, flags=re.I):
- if re.search("std_logic_vector", item, flags=re.I):
- temp = re.compile(r"\s*std_logic_vector\s*", flags=re.I)
- elif re.search("std_logic", item, flags=re.I):
- temp = re.compile(r"\s*std_logic\s*", flags=re.I)
- else:
- print("Please check your vhdl code for datatype of output port")
- sys.exit()
- else:
- print("Please check the in/out direction of your port")
- sys.exit()
-
- lhs = temp.split(item)[0]
- rhs = temp.split(item)[1]
- bit_info = re.compile(r"\s*downto\s*", flags=re.I).split(rhs)[0]
- if bit_info:
- port_info.append(lhs + ":" + str(int(bit_info) + int(1)))
- port_vector_info.append(1)
- else:
- port_info.append(lhs + ":" + str(int(1)))
- port_vector_info.append(0)
-
-print("Port Info :", port_info)
-
-# Open connection_info.txt file
-con_ifo = open('connection_info.txt', 'w')
-
-for item in port_info:
- word = item.split(':')
- con_ifo.write(
- word[0].strip() + ' ' + word[1].strip() + ' ' + word[2].strip()
- )
- con_ifo.write("\n")
-con_ifo.close()
-
-
-# ################## Reading connection/port information ################## #
-
-# Declaring input and output list
-input_list = []
-output_list = []
-
-# Reading connection_info.txt file for port infomation
-read_file = open('connection_info.txt', 'r')
-data = read_file.readlines()
-read_file.close()
-
-# Extracting input and output port list from data
-print("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
-for line in data:
- print(line)
- if re.match(r'^\s*$', line):
- pass
- else:
- in_items = re.findall(
- "IN", line, re.MULTILINE | re.IGNORECASE
- )
- out_items = re.findall(
- "OUT", line, re.MULTILINE | re.IGNORECASE
- )
- if in_items:
- input_list.append(line.split())
- else:
- pass
- # print("Not Found")
- if out_items:
- output_list.append(line.split())
- # print("Found Out")
- else:
- pass
+class ModelGeneration:
+
+ def __init__(self, file):
+
+ # Script starts from here
+ print("Arguement is : ", file)
+ self.fname = os.path.basename(file)
+ print("VHDL filename is : ", self.fname)
+ self.home = os.path.expanduser("~")
+
+ # #### Creating connection_info.txt file from vhdl file #### #
+ read_vhdl = open(file, 'r')
+ vhdl_data = read_vhdl.readlines()
+ read_vhdl.close()
+
+ start_flag = -1 # Used for scaning part of data
+ scan_data = []
+ # p=re.search('port(.*?)end',read_vhdl,re.M|re.I|re.DOTALL).group()
+
+ for item in vhdl_data:
+ if re.search('port', item, re.I):
+ start_flag = 1
+
+ elif re.search("end", item, re.I):
+ start_flag = 0
+
+ if start_flag == 1:
+ item = re.sub("port", " ", item, flags=re.I)
+ item = re.sub("\(", " ", item, flags=re.I) # noqa
+ item = re.sub("\)", " ", item, flags=re.I) # noqa
+ item = re.sub(";", " ", item, flags=re.I)
+
+ scan_data.append(item.rstrip())
+ scan_data = [_f for _f in scan_data if _f]
+ elif start_flag == 0:
+ break
+
+ port_info = []
+ self.port_vector_info = []
+
+ for item in scan_data:
+ print("Scan Data :", item)
+ if re.search("in", item, flags=re.I):
+ if re.search("std_logic_vector", item, flags=re.I):
+ temp = re.compile(r"\s*std_logic_vector\s*", flags=re.I)
+ elif re.search("std_logic", item, flags=re.I):
+ temp = re.compile(r"\s*std_logic\s*", flags=re.I)
+ else:
+ raise ValueError("Please check your vhdl " +
+ "code for datatype of input port")
+ elif re.search("out", item, flags=re.I):
+ if re.search("std_logic_vector", item, flags=re.I):
+ temp = re.compile(r"\s*std_logic_vector\s*", flags=re.I)
+ elif re.search("std_logic", item, flags=re.I):
+ temp = re.compile(r"\s*std_logic\s*", flags=re.I)
+ else:
+ raise ValueError("Please check your vhdl " +
+ "code for datatype of output port")
+ else:
+ raise ValueError(
+ "Please check the in/out direction of your port"
+ )
+
+ lhs = temp.split(item)[0]
+ rhs = temp.split(item)[1]
+ bit_info = re.compile(r"\s*downto\s*", flags=re.I).split(rhs)[0]
+ if bit_info:
+ port_info.append(lhs + ":" + str(int(bit_info) + int(1)))
+ self.port_vector_info.append(1)
+ else:
+ port_info.append(lhs + ":" + str(int(1)))
+ self.port_vector_info.append(0)
+
+ print("Port Info :", port_info)
-print("Inout List :", input_list)
-print("Output list", output_list)
-input_port = []
-output_port = []
+ # Open connection_info.txt file
+ con_ifo = open('connection_info.txt', 'w')
-# creating list of input and output port with its weight
-for input in input_list:
- input_port.append(input[0]+":"+input[2])
-for output in output_list:
- output_port.append(output[0]+":"+output[2])
+ for item in port_info:
+ word = item.split(':')
+ con_ifo.write(
+ word[0].strip() + ' ' + word[1].strip() + ' ' + word[2].strip()
+ )
+ con_ifo.write("\n")
+ con_ifo.close()
-print("Output Port List : ", output_port)
-print("Input Port List : ", input_port)
+ def readPortInfo(self):
+ # ############## Reading connection/port information ############## #
-# ################## Creating content for cfunc.mod file ################## #
+ # Declaring input and output list
+ input_list = []
+ output_list = []
-print("Starting With cfunc.mod file")
-cfunc = open('cfunc.mod', 'w')
-print("Building content for cfunc.mod file")
+ # Reading connection_info.txt file for port infomation
+ read_file = open('connection_info.txt', 'r')
+ data = read_file.readlines()
+ read_file.close()
-comment = '''/* This is cfunc.mod file auto generated by gen_con_info.py
-Developed by Fahim, Rahul at IIT Bombay */\n
+ # Extracting input and output port list from data
+ print("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
+ for line in data:
+ print(line)
+ if re.match(r'^\s*$', line):
+ pass
+ else:
+ in_items = re.findall(
+ "IN", line, re.MULTILINE | re.IGNORECASE
+ )
+ out_items = re.findall(
+ "OUT", line, re.MULTILINE | re.IGNORECASE
+ )
+ if in_items:
+ input_list.append(line.split())
+
+ if out_items:
+ output_list.append(line.split())
+
+ print("Inout List :", input_list)
+ print("Output list", output_list)
+
+ self.input_port = []
+ self.output_port = []
+
+ # creating list of input and output port with its weight
+ for input in input_list:
+ self.input_port.append(input[0]+":"+input[2])
+ for output in output_list:
+ self.output_port.append(output[0]+":"+output[2])
+
+ print("Output Port List : ", self.output_port)
+ print("Input Port List : ", self.input_port)
+
+ def createCfuncModFile(self):
+
+ # ############## Creating content for cfunc.mod file ############## #
+
+ print("Starting With cfunc.mod file")
+ cfunc = open('cfunc.mod', 'w')
+ print("Building content for cfunc.mod file")
+
+ comment = '''/* This is cfunc.mod file auto generated by gen_con_info.py
+ Developed by Fahim, Rahul at IIT Bombay */\n
+ '''
+
+ header = '''
+ #include <stdio.h>
+ #include <math.h>
+ #include <string.h>
+ #include <time.h>
+ #include <sys/socket.h>
+ #include <sys/types.h>
+ #include <netinet/in.h>
+ #include <netdb.h>
+ #include <stdlib.h>
+ #include <unistd.h>
+ #include <errno.h>
'''
-header = '''
-#include <stdio.h>
-#include <math.h>
-#include <string.h>
-#include <time.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <netinet/in.h>
-#include <netdb.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-'''
-
-function_open = (
- '''void cm_''' + fname.split('.')[0] + '''(ARGS) \n{''')
-
-digital_state_output = []
-for item in output_port:
- digital_state_output.append(
- "Digital_State_t *_op_" + item.split(':')[0] +
- ", *_op_" + item.split(':')[0] + "_old;"
- )
-
-
-var_section = '''
- // Declaring components of Client
- FILE *log_client = NULL;
- log_client=fopen("client.log","a");
- int socket_fd, bytes_recieved;
- char send_data[1024];
- char recv_data[1024];
- char *key_iter;
- struct hostent *host;
- struct sockaddr_in server_addr;
- int sock_port = 5000+PARAM(instance_id);
-'''
-
-temp_input_var = []
-for item in input_port:
- temp_input_var.append(
- "char temp_" + item.split(':')[0] + "[1024];"
- )
-
-# Start of INIT function
-init_start_function = '''
- if(INIT)
- {
- /* Allocate storage for output ports ''' \
- '''and set the load for input ports */
-'''
-
-cm_event_alloc = []
-cm_count_output = 0
-for item in output_port:
- cm_event_alloc.append(
- "cm_event_alloc(" +
- str(cm_count_output) + "," + item.split(':')[1] +
- "*sizeof(Digital_State_t));"
- )
- cm_count_output = cm_count_output + 1
-
-load_in_port = []
-for item in input_port:
- load_in_port.append(
- "for(Ii=0;Ii<PORT_SIZE(" + item.split(':')[0] +
- ");Ii++)\n\t\t{\n\t\t\tLOAD(" + item.split(':')[0] +
- "[Ii])=PARAM(input_load); \n\t\t}"
- )
-
-cm_count_ptr = 0
-cm_event_get_ptr = []
-for item in output_port:
- cm_event_get_ptr.append(
- "_op_" + item.split(':')[0] + " = _op_" +
- item.split(':')[0] +
- "_old = (Digital_State_t *) cm_event_get_ptr(" +
- str(cm_count_ptr) + ",0);"
- )
-
- cm_count_ptr = cm_count_ptr + 1
-
-systime_info = '''
- /*Taking system time info for log */
- time_t systime;
- systime = time(NULL);
- printf(ctime(&systime));
- printf("Client-Initialising GHDL...\\n\\n");
- fprintf(log_client,"Setup Client Server Connection at %s \\n"''' \
- ''',ctime(&systime));
-'''
-
-init_else = '''
- printf("Client-Inside else of INIT \\n");
- fprintf(log_client,"Inside else of INIT \\n");
- /* retrieve storage for output ports. */
-'''
-
-els_evt_ptr = []
-els_evt_count1 = 0
-els_evt_count2 = 0
-for item in output_port:
- els_evt_ptr.append("_op_" + item.split(":")[0] +
- " = (Digital_State_t *) cm_event_get_ptr(" +
- str(els_evt_count1) + "," + str(els_evt_count2) +
- ");")
- els_evt_count2 = els_evt_count2 + 1
- els_evt_ptr.append("_op_" + item.split(":")[0] +
- "_old" + " = (Digital_State_t *) cm_event_get_ptr(" +
- str(els_evt_count1)+","+str(els_evt_count2)+");")
- els_evt_count1 = els_evt_count1 + 1
-
-
-client_setup_ip = '''
- /* Client Setup IP Addr */
- FILE *fptr;
- int ip_count = 0;
- char* my_ip = malloc(16);
-
- char ip_filename[40];
- sprintf(ip_filename, "/tmp/NGHDL_COMMON_IP_%d.txt", getpid());
-
- fptr = fopen(ip_filename, "r");
- if (fptr)
- {
- char line[20];
- while(fscanf(fptr, "%s", line) == 1) {
- ip_count++;
- }
+ function_open = (
+ '''void cm_''' + self.fname.split('.')[0] + '''(ARGS) \n{''')
+
+ digital_state_output = []
+ for item in self.output_port:
+ digital_state_output.append(
+ "Digital_State_t *_op_" + item.split(':')[0] +
+ ", *_op_" + item.split(':')[0] + "_old;"
+ )
+
+ var_section = '''
+ // Declaring components of Client
+ FILE *log_client = NULL;
+ log_client=fopen("client.log","a");
+ int socket_fd, bytes_recieved;
+ char send_data[1024];
+ char recv_data[1024];
+ char *key_iter;
+ struct hostent *host;
+ struct sockaddr_in server_addr;
+ int sock_port = 5000+PARAM(instance_id);
+ '''
+
+ temp_input_var = []
+ for item in self.input_port:
+ temp_input_var.append(
+ "char temp_" + item.split(':')[0] + "[1024];"
+ )
+
+ # Start of INIT function
+ init_start_function = '''
+ if(INIT)
+ {
+ /* Allocate storage for output ports ''' \
+ '''and set the load for input ports */
+ '''
+
+ cm_event_alloc = []
+ cm_count_output = 0
+ for item in self.output_port:
+ cm_event_alloc.append(
+ "cm_event_alloc(" +
+ str(cm_count_output) + "," + item.split(':')[1] +
+ "*sizeof(Digital_State_t));"
+ )
+ cm_count_output = cm_count_output + 1
+
+ load_in_port = []
+ for item in self.input_port:
+ load_in_port.append(
+ "for(Ii=0;Ii<PORT_SIZE(" + item.split(':')[0] +
+ ");Ii++)\n\t\t{\n\t\t\tLOAD(" + item.split(':')[0] +
+ "[Ii])=PARAM(input_load); \n\t\t}"
+ )
+
+ cm_count_ptr = 0
+ cm_event_get_ptr = []
+ for item in self.output_port:
+ cm_event_get_ptr.append(
+ "_op_" + item.split(':')[0] + " = _op_" +
+ item.split(':')[0] +
+ "_old = (Digital_State_t *) cm_event_get_ptr(" +
+ str(cm_count_ptr) + ",0);"
+ )
+
+ cm_count_ptr = cm_count_ptr + 1
+
+ systime_info = '''
+ /*Taking system time info for log */
+ time_t systime;
+ systime = time(NULL);
+ printf(ctime(&systime));
+ printf("Client-Initialising GHDL...\\n\\n");
+ fprintf(log_client,"Setup Client Server Connection at %s \\n"''' \
+ ''',ctime(&systime));
+ '''
+
+ els_evt_ptr = []
+ els_evt_count1 = 0
+ els_evt_count2 = 0
+ for item in self.output_port:
+ els_evt_ptr.append("_op_" + item.split(":")[0] +
+ " = (Digital_State_t *) cm_event_get_ptr(" +
+ str(els_evt_count1) + "," +
+ str(els_evt_count2) + ");")
+ els_evt_count2 = els_evt_count2 + 1
+ els_evt_ptr.append("_op_" + item.split(":")[0] + "_old" +
+ " = (Digital_State_t *) cm_event_get_ptr(" +
+ str(els_evt_count1) + "," +
+ str(els_evt_count2) + ");")
+ els_evt_count1 = els_evt_count1 + 1
+
+ client_setup_ip = '''
+ /* Client Setup IP Addr */
+ FILE *fptr;
+ int ip_count = 0;
+ char* my_ip = malloc(16);
+
+ char ip_filename[40];
+ sprintf(ip_filename, "/tmp/NGHDL_COMMON_IP_%d.txt", getpid());
+
+ fptr = fopen(ip_filename, "r");
+ if (fptr)
+ {
+ char line[20];
+ while(fscanf(fptr, "%s", line) == 1) {
+ ip_count++;
+ }
+
+ fclose(fptr);
+ }
+
+ if (ip_count < 255) {
+ sprintf(my_ip, "127.0.0.%d", ip_count+1);
+ } else {
+ sprintf(my_ip, "127.0.%d.1", (ip_count+1)%256);
+ }
+
+ fptr = fopen(ip_filename, "a");
+ if (fptr)
+ {
+ fprintf(fptr, "%s\\n", my_ip);
+ fclose(fptr);
+ } else {
+ perror("Client - cannot open Common_IP file ");
+ exit(1);
+ }
+
+ STATIC_VAR(my_ip) = my_ip;
+ '''
+
+ client_fetch_ip = '''
+ /* Client Fetch IP Addr */
+
+ char* my_ip = STATIC_VAR(my_ip);
+
+ host = gethostbyname(my_ip);
+ fprintf(log_client,"Creating client socket \\n");
+ '''
- fclose(fptr);
- }
-
- if (ip_count < 255) {
- sprintf(my_ip, "127.0.0.%d", ip_count+1);
- } else {
- sprintf(my_ip, "127.0.%d.1", (ip_count+1)%256);
- }
-
- fptr = fopen(ip_filename, "a");
- if (fptr)
- {
- fprintf(fptr, "%s\\n", my_ip);
- fclose(fptr);
- } else {
- perror("Client - cannot open Common_IP file ");
- exit(1);
- }
-
- STATIC_VAR(my_ip) = my_ip;
-'''
-
-client_fetch_ip = '''
- /* Client Fetch IP Addr */
-
- char* my_ip = STATIC_VAR(my_ip);
-
- host = gethostbyname(my_ip);
- fprintf(log_client,"Creating client socket \\n");
-'''
-
-create_socket = '''
- //Creating socket for client
- if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {
- perror("Client - Error while creating client Socket ");
- fprintf(log_client,"Error while creating client socket \\n");
- exit(1);
- }
-
- printf("Client-Socket (Id : %d) created\\n", socket_fd);
- fprintf(log_client,"Client-Client Socket created successfully \\n");
- fprintf(log_client,"Client- Socket Id : %d \\n",socket_fd);
-
- // memset(&server_addr, 0, sizeof(server_addr));
- server_addr.sin_family = AF_INET;
- server_addr.sin_port = htons(sock_port);
- server_addr.sin_addr = *((struct in_addr *)host->h_addr);
- bzero(&(server_addr.sin_zero),8);
-
-'''
-
-connect_server = '''
- fprintf(log_client,"Client-Connecting to server \\n");
-
- //Connecting to server
- int try_limit=10;
- while(try_limit>0)
- {
- if (connect(socket_fd, (struct sockaddr*)&server_addr,''' \
- '''sizeof(struct sockaddr)) == -1)
- {
- sleep(1);
- try_limit--;
- if(try_limit==0)
+ create_socket = '''
+ //Creating socket for client
+ if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
- fprintf(stderr,"Connect- Error:Tried to connect server on port,''' \
- '''failed...giving up \\n");
- fprintf(log_client,"Connect- Error:Tried to connect server on ''' \
- '''port, failed...giving up \\n");
+ perror("Client - Error while creating client Socket ");
+ fprintf(log_client,"Error while creating client socket \\n");
exit(1);
}
- }
- else
- {
- printf("Client-Connected to server \\n");
- fprintf(log_client,"Client-Connected to server \\n");
- break;
- }
- }
-'''
-
-# Assign bit value to every input
-assign_data_to_input = []
-for item in input_port:
- assign_data_to_input.append("\tfor(Ii=0;Ii<PORT_SIZE(" +
- item.split(':')[0] + ");Ii++)\n\
-\t{\n\t\tif( INPUT_STATE(" + item.split(':')[0] + "[Ii])==ZERO )\n\
-\t\t{\n\t\t\ttemp_" + item.split(':')[0] + "[Ii]='0';\n\t\t}\n\
-\t\telse\n\t\t{\n\t\t\ttemp_" + item.split(':')[0] + "[Ii]='1';\n\
-\t\t}\n\t}\n\ttemp_" + item.split(':')[0] + "[Ii]='\\0';\n\n")
-
-snprintf_stmt = []
-snprintf_count = 0
-snprintf_stmt.append("\t//Sending and receiving data to-from server \n")
-snprintf_stmt.append('\tsnprintf(send_data,sizeof(send_data),"')
-for item in input_port:
- snprintf_count = snprintf_count + 1
- snprintf_stmt.append(item.split(':')[0] + ":%s")
- if snprintf_count == len(input_port):
- snprintf_stmt.append('", ')
- internal_count = 0
- for item1 in input_port:
- if internal_count == len(input_port):
- pass
- else:
- snprintf_stmt.append("temp_" + item1.split(':')[0])
- internal_count = internal_count + 1
- if internal_count == len(input_port):
- pass
- else:
- snprintf_stmt.append(",")
- snprintf_stmt.append(");")
- else:
- snprintf_stmt.append(",")
-
-send_data = '''
-
- if ( send(socket_fd,send_data,sizeof(send_data),0)==-1)
- {
- fprintf(stderr, "Client-Failure Sending Message \\n");
- close(socket_fd);
- exit(1);
- }
- else
- {
- printf("Client-Message sent: %s \\n",send_data);
- fprintf(log_client,"Socket Id : %d & Message sent : %s \\n"''' \
- ''',socket_fd,send_data);
- }
-
-'''
-
-recv_data = '''
-
- bytes_recieved=recv(socket_fd,recv_data,sizeof(recv_data),0);
- if ( bytes_recieved <= 0 )
- {
- perror("Client-Either Connection Closed or Error ");
- exit(1);
- }
- recv_data[bytes_recieved] = '\\0';
-
- printf("Client-Message Received - %s\\n\\n",recv_data);
- fprintf(log_client,"Message Received From Server- %s\\n",recv_data);
-
-'''
-
-# Scheduling output event
-
-sch_output_event = []
-
-for item in output_port:
- sch_output_event.append(
- "\t/* Scheduling event and processing them */\n\
-\tif((key_iter=strstr(recv_data, " + '"' + item.split(':')[0] + ':"'")) != NULL)\n\
-\t{\n\
-\t\twhile(*key_iter++ != ':');\n\
-\t\tfor(Ii=0;*key_iter != ';';Ii++,key_iter++)\n\
-\t\t{\n\
-\t\t\tfprintf(log_client,\"Client-Bit val is %c \\n\",*key_iter);\n\
-\t\t\tif(*key_iter=='0')\n\t\t\t{\n\
-\t\t\t\t_op_" + item.split(':')[0] + "[Ii]=ZERO;\n\t\t\t}\n\
-\t\t\telse if(*key_iter=='1')\n\t\t\t{\n\
-\t\t\t\t_op_" + item.split(':')[0] + "[Ii]=ONE;\n\
-\t\t\t}\n\t\t\telse\n\t\t\t{\n\
-\t\t\t\tfprintf(log_client,\"Unknow value return from server \\n\");\n\
-\t\t\t\tprintf(\"Client-Unknown value return \\n\");\n\t\t\t}\n\n\
-\t\t\tif(ANALYSIS == DC)\n\t\t\t{\n\
-\t\t\t\tOUTPUT_STATE(" + item.split(':')[0] + "[Ii]) = _op_" + item.split(':')[0] + "[Ii];\n\
-\t\t\t}\n\t\t\telse if(_op_" + item.split(':')[0] + "[Ii] != _op_" + item.split(':')[0] + "_old[Ii])\n\
-\t\t\t{\n\t\t\t\tOUTPUT_STATE(" + item.split(':')[0] + "[Ii]) = _op_" + item.split(':')[0] + "[Ii];\n\
-\t\t\t\tOUTPUT_DELAY(" + item.split(':')[0] + "[Ii]) = ((_op_" + item.split(':')[0] + "[Ii] == ZERO) ? PARAM(fall_delay) : PARAM(rise_delay));\n\
-\t\t\t}\n\t\t\telse\n\t\t\t{\n\
-\t\t\t\tOUTPUT_CHANGED(" + item.split(':')[0] + "[Ii]) = FALSE;\n\t\t\t}\n\
-\t\t\tOUTPUT_STRENGTH(" + item.split(':')[0] + "[Ii]) = STRONG;\n\
-\t\t}\n\
-\t}\n")
-
-# Writing content in cfunc.mod file
-cfunc.write(comment)
-cfunc.write(header)
-cfunc.write("\n")
-cfunc.write(function_open)
-cfunc.write("\n")
-
-# Adding digital state Variable
-for item in digital_state_output:
- cfunc.write("\t" + item + "\n")
-
-# Adding variable declaration section
-cfunc.write(var_section)
-for item in temp_input_var:
- cfunc.write("\t" + item + "\n")
-cfunc.write("\n")
-
-# Adding INIT portion
-cfunc.write(init_start_function)
-for item in cm_event_alloc:
- cfunc.write(2 * "\t" + item)
- cfunc.write("\n")
-
-cfunc.write(2 * "\t" + "/* set the load for input ports. */")
-cfunc.write("\n")
-cfunc.write(2 * "\t" + "int Ii;")
-cfunc.write("\n")
-
-for item in load_in_port:
- cfunc.write(2 * "\t" + item)
- cfunc.write("\n")
-cfunc.write("\n")
-cfunc.write(2 * "\t" + "/*Retrieve Storage for output*/")
-cfunc.write("\n")
-for item in cm_event_get_ptr:
- cfunc.write(2 * "\t" + item)
- cfunc.write("\n")
-cfunc.write(systime_info)
-cfunc.write("\n")
-cfunc.write(client_setup_ip)
-cfunc.write("\n")
-cfunc.write("\t\tchar command[1024];\n")
-cfunc.write(
- '\t\tsnprintf(command,1024,"' + home +
- '/ngspice-nghdl/src/xspice/icm/ghdl/' +
- fname.split('.')[0] +
- '/DUTghdl/start_server.sh %d %s &",sock_port,my_ip);'
-)
-cfunc.write('\n\t\tsystem(command);')
-cfunc.write("\n\t}")
-cfunc.write("\n")
-cfunc.write("\telse\n\t{\n")
-
-for item in els_evt_ptr:
- cfunc.write(2 * "\t" + item)
- cfunc.write("\n")
-cfunc.write("\t}")
-cfunc.write("\n\n")
-
-cfunc.write(client_fetch_ip)
-cfunc.write(create_socket)
-cfunc.write(connect_server)
-
-cfunc.write("\t//Formating data for sending it to client\n")
-cfunc.write("\tint Ii;\n\n")
-
-for item in assign_data_to_input:
- cfunc.write(item)
-
-for item in snprintf_stmt:
- cfunc.write(item)
-
-cfunc.write(send_data)
-cfunc.write(recv_data)
-
-for item in sch_output_event:
- cfunc.write(item)
-
-# Close socket fd
-cfunc.write("\tclose(socket_fd);\n\n")
-
-# close log_client file
-cfunc.write("\tfclose(log_client);")
-
-# Close cm_ function
-cfunc.write("\n}")
-cfunc.close()
-
-
-# ####################### Creating ifspec.ifs file ######################## #
-
-print("Starting with ifspec.ifs file")
-ifspec = open('ifspec.ifs', 'w')
-
-print("Gathering Al the content for ifspec file")
-
-ifspec_comment = '''
-/*
-SUMMARY: This file is auto generated and it contains the interface
- specification for the code model. */\n
-'''
-
-name_table = 'NAME_TABLE:\n\
-C_Function_Name: cm_' + fname.split('.')[0] + '\n\
-Spice_Model_Name: ' + fname.split('.')[0] + '\n\
-Description: "Model generated from ghdl code ' + fname + '" \n'
-
-# Input and Output Port Table
-in_port_table = []
-out_port_table = []
-
-for item in input_port:
- port_table = 'PORT_TABLE:\n'
- port_name = 'Port_Name:\t' + item.split(':')[0] + '\n'
- description = 'Description:\t"input port ' + item.split(':')[0] + '"\n'
- direction = 'Direction:\tin\n'
- default_type = 'Default_Type:\td\n'
- allowed_type = 'Allowed_Types:\t[d]\n'
- vector = 'Vector:\tyes\n'
- vector_bounds = (
- 'Vector_Bounds:\t[' + item.split(':')[1] +
- ' ' + item.split(":")[1] + ']\n'
- )
- null_allowed = 'Null_Allowed:\tno\n'
-
- # Insert detail in the list
- in_port_table.append(
- port_table + port_name + description + direction + default_type +
- allowed_type + vector + vector_bounds + null_allowed
- )
-
-
-for item in output_port:
- port_table = 'PORT_TABLE:\n'
- port_name = 'Port_Name:\t' + item.split(':')[0] + '\n'
- description = 'Description:\t"output port ' + item.split(':')[0] + '"\n'
- direction = 'Direction:\tout\n'
- default_type = 'Default_Type:\td\n'
- allowed_type = 'Allowed_Types:\t[d]\n'
- vector = 'Vector:\tyes\n'
- vector_bounds = (
- 'Vector_Bounds:\t[' + item.split(':')[1] +
- ' ' + item.split(":")[1] + ']\n'
- )
- null_allowed = 'Null_Allowed:\tno\n'
-
- # Insert detail in the list
- in_port_table.append(
- port_table + port_name + description + direction + default_type +
- allowed_type + vector + vector_bounds + null_allowed
- )
-
-parameter_table = '''
-
-PARAMETER_TABLE:
-Parameter_Name: instance_id input_load
-Description: "instance_id" "input load value (F)"
-Data_Type: real real
-Default_Value: 0 1.0e-12
-Limits: - -
-Vector: no no
-Vector_Bounds: - -
-Null_Allowed: yes yes
-
-PARAMETER_TABLE:
-Parameter_Name: rise_delay fall_delay
-Description: "rise delay" "fall delay"
-Data_Type: real real
-Default_Value: 1.0e-9 1.0e-9
-Limits: [1e-12 -] [1e-12 -]
-Vector: no no
-Vector_Bounds: - -
-Null_Allowed: yes yes
-
-'''
-
-static_table = '''
-
-STATIC_VAR_TABLE:
-
-Static_Var_Name: my_ip
-Data_Type: pointer
-Description: "connect to ghdlserver through this ip"
-
-'''
-
-# Writing all the content in ifspec file
-ifspec.write(ifspec_comment)
-ifspec.write(name_table + "\n\n")
-
-for item in in_port_table:
- ifspec.write(item + "\n")
-
-ifspec.write("\n")
-
-for item in out_port_table:
- ifspec.write(item + "\n")
-
-ifspec.write("\n")
-ifspec.write(parameter_table)
-ifspec.write("\n")
-ifspec.write(static_table)
-ifspec.close()
-
-
-# ######################### Creating testbench file ######################### #
-
-print("Starting with testbench file")
-
-testbench = open(fname.split('.')[0] + '_tb.vhdl', 'w')
-print(fname.split('.')[0] + '_tb.vhdl')
-
-# comment
-comment_vhdl = "-------------------------------------------------------------"
-comment_vhdl += "-------------------\n"
-comment_vhdl += "--This testbench has been created by Ambikeshwar Srivastava, "
-comment_vhdl += "Rahul Paknikar \n"
-comment_vhdl += "--------------------------- FOSSEE, IIT Bombay --------------"
-comment_vhdl += "-------------------\n"
-comment_vhdl += "-------------------------------------------------------------"
-comment_vhdl += "-------------------\n"
-
-# Adding header, entity and architecture statement
-tb_header = '''
-library ieee;
-use ieee.std_logic_1164.all;
-use ieee.numeric_std.all;
-library work;
-use work.Vhpi_Foreign.all;
-use work.Utility_Package.all;
-use work.sock_pkg.all;
-
-'''
-
-tb_entity = "entity " + fname.split('.')[0] + "_tb is\nend entity;\n\n"
-
-arch = ("architecture " + fname.split('.')[0] + "_tb_beh of " +
- fname.split('.')[0] + "_tb is\n")
-
-# Adding components
-components = []
-components.append(
- "\tcomponent " + fname.split('.')[0] + " is\n\t\tport(\n\t\t\t\t"
-)
-
-port_vector_count = 0
-
-for item in input_port:
- if port_vector_info[port_vector_count]:
- components.append(
- item.split(':')[0] + ": in std_logic_vector(" +
- str(int(item.split(':')[1]) - int(1)) +
- " downto 0);\n\t\t\t\t"
- )
- else:
- components.append(
- item.split(':')[0] + ": in std_logic;\n\t\t\t\t"
- )
- port_vector_count += 1
- # if item.split(":")[1] != '1':
- # components.append(item.split(':')[0]+": in std_logic_vector("
- # +str(int(item.split(':')[1])-int(1))+" downto 0);\n\t\t\t\t
- # ")
- # else:
- # components.append(item.split(':')[0]+": in std_logic_vector("
- # +str(int(item.split(':')[1])-int(1))+" downto 0);\n\t\t\t\t
- # ")
-for item in output_port[:-1]:
- if port_vector_info[port_vector_count]:
- components.append(
- item.split(':')[0] + ": out std_logic_vector(" +
- str(int(item.split(':')[1]) - int(1)) +
- " downto 0);\n\t\t\t\t"
+ printf("Client-Socket (Id : %d) created\\n", socket_fd);
+ fprintf(log_client,"Client-Client Socket created ''' \
+ '''successfully \\n");
+ fprintf(log_client,"Client- Socket Id : %d \\n",socket_fd);
+
+ // memset(&server_addr, 0, sizeof(server_addr));
+ server_addr.sin_family = AF_INET;
+ server_addr.sin_port = htons(sock_port);
+ server_addr.sin_addr = *((struct in_addr *)host->h_addr);
+ bzero(&(server_addr.sin_zero),8);
+
+ '''
+
+ connect_server = '''
+ fprintf(log_client,"Client-Connecting to server \\n");
+
+ //Connecting to server
+ int try_limit=10;
+ while(try_limit>0)
+ {
+ if (connect(socket_fd, (struct sockaddr*)&server_addr,''' \
+ '''sizeof(struct sockaddr)) == -1)
+ {
+ sleep(1);
+ try_limit--;
+ if(try_limit==0)
+ {
+ fprintf(stderr,"Connect- Error:Tried to connect server on port,''' \
+ '''failed...giving up \\n");
+ fprintf(log_client,"Connect- Error:Tried to connect server on ''' \
+ '''port, failed...giving up \\n");
+ exit(1);
+ }
+ }
+ else
+ {
+ printf("Client-Connected to server \\n");
+ fprintf(log_client,"Client-Connected to server \\n");
+ break;
+ }
+ }
+ '''
+
+ # Assign bit value to every input
+ assign_data_to_input = []
+ for item in self.input_port:
+ assign_data_to_input.append("\tfor(Ii=0;Ii<PORT_SIZE(" +
+ item.split(':')[0] + ");Ii++)\n\
+ \t{\n\t\tif( INPUT_STATE(" + item.split(':')[0] + "[Ii])==ZERO )\n\
+ \t\t{\n\t\t\ttemp_" + item.split(':')[0] + "[Ii]='0';\n\t\t}\n\
+ \t\telse\n\t\t{\n\t\t\ttemp_" + item.split(':')[0] + "[Ii]='1';\n\
+ \t\t}\n\t}\n\ttemp_" + item.split(':')[0] + "[Ii]='\\0';\n\n")
+
+ snprintf_stmt = []
+ snprintf_count = 0
+ snprintf_stmt.append(
+ "\t//Sending and receiving data to-from server \n"
)
- else:
- components.append(
- item.split(':')[0] + ": out std_logic;\n\t\t\t\t"
+ snprintf_stmt.append('\tsnprintf(send_data,sizeof(send_data),"')
+ for item in self.input_port:
+ snprintf_count = snprintf_count + 1
+ snprintf_stmt.append(item.split(':')[0] + ":%s")
+ if snprintf_count == len(self.input_port):
+ snprintf_stmt.append('", ')
+ internal_count = 0
+ for item1 in self.input_port:
+ if internal_count == len(self.input_port):
+ pass
+ else:
+ snprintf_stmt.append("temp_" + item1.split(':')[0])
+ internal_count = internal_count + 1
+ if internal_count == len(self.input_port):
+ pass
+ else:
+ snprintf_stmt.append(",")
+ snprintf_stmt.append(");")
+ else:
+ snprintf_stmt.append(",")
+
+ send_data = '''
+
+ if ( send(socket_fd,send_data,sizeof(send_data),0)==-1)
+ {
+ fprintf(stderr, "Client-Failure Sending Message \\n");
+ close(socket_fd);
+ exit(1);
+ }
+ else
+ {
+ printf("Client-Message sent: %s \\n",send_data);
+ fprintf(log_client,"Socket Id : %d & Message sent : %s \\n"''' \
+ ''',socket_fd,send_data);
+ }
+
+ '''
+
+ recv_data = '''
+
+ bytes_recieved=recv(socket_fd,recv_data,sizeof(recv_data),0);
+ if ( bytes_recieved <= 0 )
+ {
+ perror("Client-Either Connection Closed or Error ");
+ exit(1);
+ }
+ recv_data[bytes_recieved] = '\\0';
+
+ printf("Client-Message Received - %s\\n\\n",recv_data);
+ fprintf(log_client,"Message Received From Server-''' \
+ '''%s\\n",recv_data);
+
+ '''
+
+ # Scheduling output event
+ sch_output_event = []
+
+ for item in self.output_port:
+ sch_output_event.append(
+ "\t/* Scheduling event and processing them */\n\
+ \tif((key_iter=strstr(recv_data, " + '"' + item.split(':')[0] + ':"'")) != NULL)\n\
+ \t{\n\
+ \t\twhile(*key_iter++ != ':');\n\
+ \t\tfor(Ii=0;*key_iter != ';';Ii++,key_iter++)\n\
+ \t\t{\n\
+ \t\t\tfprintf(log_client,\"Client-Bit val is %c \\n\",*key_iter);\n\
+ \t\t\tif(*key_iter=='0')\n\t\t\t{\n\
+ \t\t\t\t_op_" + item.split(':')[0] + "[Ii]=ZERO;\n\t\t\t}\n\
+ \t\t\telse if(*key_iter=='1')\n\t\t\t{\n\
+ \t\t\t\t_op_" + item.split(':')[0] + "[Ii]=ONE;\n\
+ \t\t\t}\n\t\t\telse\n\t\t\t{\n\
+ \t\t\t\tfprintf(log_client,\"Unknow value return from server \\n\");\n\
+ \t\t\t\tprintf(\"Client-Unknown value return \\n\");\n\t\t\t}\n\n\
+ \t\t\tif(ANALYSIS == DC)\n\t\t\t{\n\
+ \t\t\t\tOUTPUT_STATE(" + item.split(':')[0] + "[Ii]) = _op_" + item.split(':')[0] + "[Ii];\n\
+ \t\t\t}\n\t\t\telse if(_op_" + item.split(':')[0] + "[Ii] != _op_" + item.split(':')[0] + "_old[Ii])\n\
+ \t\t\t{\n\t\t\t\tOUTPUT_STATE(" + item.split(':')[0] + "[Ii]) = _op_" + item.split(':')[0] + "[Ii];\n\
+ \t\t\t\tOUTPUT_DELAY(" + item.split(':')[0] + "[Ii]) = ((_op_" + item.split(':')[0] + "[Ii] == ZERO) ? PARAM(fall_delay) : PARAM(rise_delay));\n\
+ \t\t\t}\n\t\t\telse\n\t\t\t{\n\
+ \t\t\t\tOUTPUT_CHANGED(" + item.split(':')[0] + "[Ii]) = FALSE;\n\t\t\t}\n\
+ \t\t\tOUTPUT_STRENGTH(" + item.split(':')[0] + "[Ii]) = STRONG;\n\
+ \t\t}\n\
+ \t}\n")
+
+ # Writing content in cfunc.mod file
+ cfunc.write(comment)
+ cfunc.write(header)
+ cfunc.write("\n")
+ cfunc.write(function_open)
+ cfunc.write("\n")
+
+ # Adding digital state Variable
+ for item in digital_state_output:
+ cfunc.write("\t" + item + "\n")
+
+ # Adding variable declaration section
+ cfunc.write(var_section)
+ for item in temp_input_var:
+ cfunc.write("\t" + item + "\n")
+ cfunc.write("\n")
+
+ # Adding INIT portion
+ cfunc.write(init_start_function)
+ for item in cm_event_alloc:
+ cfunc.write(2 * "\t" + item)
+ cfunc.write("\n")
+
+ cfunc.write(2 * "\t" + "/* set the load for input ports. */")
+ cfunc.write("\n")
+ cfunc.write(2 * "\t" + "int Ii;")
+ cfunc.write("\n")
+
+ for item in load_in_port:
+ cfunc.write(2 * "\t" + item)
+ cfunc.write("\n")
+ cfunc.write("\n")
+ cfunc.write(2 * "\t" + "/*Retrieve Storage for output*/")
+ cfunc.write("\n")
+ for item in cm_event_get_ptr:
+ cfunc.write(2 * "\t" + item)
+ cfunc.write("\n")
+ cfunc.write(systime_info)
+ cfunc.write("\n")
+ cfunc.write(client_setup_ip)
+ cfunc.write("\n")
+ cfunc.write("\t\tchar command[1024];\n")
+ cfunc.write(
+ '\t\tsnprintf(command,1024,"' + self.home +
+ '/ngspice-nghdl/src/xspice/icm/ghdl/' +
+ self.fname.split('.')[0] +
+ '/DUTghdl/start_server.sh %d %s &",sock_port,my_ip);'
)
+ cfunc.write('\n\t\tsystem(command);')
+ cfunc.write("\n\t}")
+ cfunc.write("\n")
+ cfunc.write("\telse\n\t{\n")
+
+ for item in els_evt_ptr:
+ cfunc.write(2 * "\t" + item)
+ cfunc.write("\n")
+ cfunc.write("\t}")
+ cfunc.write("\n\n")
+
+ cfunc.write(client_fetch_ip)
+ cfunc.write(create_socket)
+ cfunc.write(connect_server)
- port_vector_count += 1
-
-if port_vector_info[port_vector_count]:
- components.append(
- output_port[-1].split(':')[0] + ": out std_logic_vector(" +
- str(int(output_port[-1].split(':')[1]) - int(1)) +
- " downto 0)\n\t\t\t\t"
- )
-else:
- components.append(
- output_port[-1].split(':')[0] + ": out std_logic\n\t\t\t\t"
- )
- # if item.split(":")[1] != '1':
- # components.append(item.split(':')[0]+":
- # out std_logic_vector("
- # +str(int(item.split(':')[1])-int(1))+" downto 0)\n\t\t\t\t")
- # else:
- # components.append(item.split(':')[0]+":
- # out std_logic_vector("
- # +str(int(item.split(':')[1])-int(1))+" downto 0)\n\t\t\t\t")
-
-components.append(");\n")
-components.append("\tend component;\n\n")
-
-# Adding signals
-signals = []
-signals.append("\tsignal clk_s : std_logic := '0';\n")
-
-port_vector_count = 0
-
-for item in input_port:
- if port_vector_info[port_vector_count]:
- signals.append(
- "\tsignal " + item.split(':')[0] + ": std_logic_vector(" +
- str(int(item.split(':')[1]) - int(1)) + " downto 0);\n"
+ cfunc.write("\t//Formating data for sending it to client\n")
+ cfunc.write("\tint Ii;\n\n")
+
+ for item in assign_data_to_input:
+ cfunc.write(item)
+
+ for item in snprintf_stmt:
+ cfunc.write(item)
+
+ cfunc.write(send_data)
+ cfunc.write(recv_data)
+
+ for item in sch_output_event:
+ cfunc.write(item)
+
+ # Close socket fd
+ cfunc.write("\tclose(socket_fd);\n\n")
+
+ # close log_client file
+ cfunc.write("\tfclose(log_client);")
+
+ # Close cm_ function
+ cfunc.write("\n}")
+ cfunc.close()
+
+ def createIfSpecFile(self):
+
+ # ################### Creating ifspec.ifs file #################### #
+
+ print("Starting with ifspec.ifs file")
+ ifspec = open('ifspec.ifs', 'w')
+
+ print("Gathering Al the content for ifspec file")
+
+ ifspec_comment = '''
+ /*
+ SUMMARY: This file is auto generated and it contains the interface
+ specification for the code model. */\n
+ '''
+
+ name_table = 'NAME_TABLE:\n\
+ C_Function_Name: cm_' + self.fname.split('.')[0] + '\n\
+ Spice_Model_Name: ' + self.fname.split('.')[0] + '\n\
+ Description: "Model generated from ghdl code ' + self.fname + '" \n'
+
+ # Input and Output Port Table
+ in_port_table = []
+ out_port_table = []
+
+ for item in self.input_port:
+ port_table = 'PORT_TABLE:\n'
+ port_name = 'Port_Name:\t' + item.split(':')[0] + '\n'
+ description = (
+ 'Description:\t"input port ' + item.split(':')[0] + '"\n'
+ )
+ direction = 'Direction:\tin\n'
+ default_type = 'Default_Type:\td\n'
+ allowed_type = 'Allowed_Types:\t[d]\n'
+ vector = 'Vector:\tyes\n'
+ vector_bounds = (
+ 'Vector_Bounds:\t[' + item.split(':')[1] +
+ ' ' + item.split(":")[1] + ']\n'
+ )
+ null_allowed = 'Null_Allowed:\tno\n'
+
+ # Insert detail in the list
+ in_port_table.append(
+ port_table + port_name + description +
+ direction + default_type + allowed_type +
+ vector + vector_bounds + null_allowed
+ )
+
+ for item in self.output_port:
+ port_table = 'PORT_TABLE:\n'
+ port_name = 'Port_Name:\t' + item.split(':')[0] + '\n'
+ description = (
+ 'Description:\t"output port ' + item.split(':')[0] + '"\n'
+ )
+ direction = 'Direction:\tout\n'
+ default_type = 'Default_Type:\td\n'
+ allowed_type = 'Allowed_Types:\t[d]\n'
+ vector = 'Vector:\tyes\n'
+ vector_bounds = (
+ 'Vector_Bounds:\t[' + item.split(':')[1] +
+ ' ' + item.split(":")[1] + ']\n'
+ )
+ null_allowed = 'Null_Allowed:\tno\n'
+
+ # Insert detail in the list
+ in_port_table.append(
+ port_table + port_name + description +
+ direction + default_type + allowed_type +
+ vector + vector_bounds + null_allowed
+ )
+
+ parameter_table = '''
+
+ PARAMETER_TABLE:
+ Parameter_Name: instance_id input_load
+ Description: "instance_id" "input load value (F)"
+ Data_Type: real real
+ Default_Value: 0 1.0e-12
+ Limits: - -
+ Vector: no no
+ Vector_Bounds: - -
+ Null_Allowed: yes yes
+
+ PARAMETER_TABLE:
+ Parameter_Name: rise_delay fall_delay
+ Description: "rise delay" "fall delay"
+ Data_Type: real real
+ Default_Value: 1.0e-9 1.0e-9
+ Limits: [1e-12 -] [1e-12 -]
+ Vector: no no
+ Vector_Bounds: - -
+ Null_Allowed: yes yes
+
+ '''
+
+ static_table = '''
+
+ STATIC_VAR_TABLE:
+
+ Static_Var_Name: my_ip
+ Data_Type: pointer
+ Description: "connect to ghdlserver through this ip"
+
+ '''
+
+ # Writing all the content in ifspec file
+ ifspec.write(ifspec_comment)
+ ifspec.write(name_table + "\n\n")
+
+ for item in in_port_table:
+ ifspec.write(item + "\n")
+
+ ifspec.write("\n")
+
+ for item in out_port_table:
+ ifspec.write(item + "\n")
+
+ ifspec.write("\n")
+ ifspec.write(parameter_table)
+ ifspec.write("\n")
+ ifspec.write(static_table)
+ ifspec.close()
+
+ def createTestbench(self):
+
+ # #################### Creating testbench file ##################### #
+
+ print("Starting with testbench file")
+
+ testbench = open(self.fname.split('.')[0] + '_tb.vhdl', 'w')
+ print(self.fname.split('.')[0] + '_tb.vhdl')
+
+ # comment
+ comment_vhdl = "------------------------------------------------------"
+ comment_vhdl += "--------------------------\n"
+ comment_vhdl += "--This testbench has been created by "
+ comment_vhdl += "Ambikeshwar Srivastava, Rahul Paknikar \n"
+ comment_vhdl += "--------------------------- FOSSEE, IIT Bombay ------"
+ comment_vhdl += "---------------------------\n"
+ comment_vhdl += "-----------------------------------------------------"
+ comment_vhdl += "---------------------------\n"
+
+ # Adding header, entity and architecture statement
+ tb_header = '''
+ library ieee;
+ use ieee.std_logic_1164.all;
+ use ieee.numeric_std.all;
+ library work;
+ use work.Vhpi_Foreign.all;
+ use work.Utility_Package.all;
+ use work.sock_pkg.all;
+
+ '''
+
+ tb_entity = ("entity " + self.fname.split('.')[0] +
+ "_tb is\nend entity;\n\n")
+
+ arch = ("architecture " + self.fname.split('.')[0] + "_tb_beh of " +
+ self.fname.split('.')[0] + "_tb is\n")
+
+ # Adding components
+ components = []
+ components.append("\tcomponent " + self.fname.split('.')[0] +
+ " is\n\t\tport(\n\t\t\t\t")
+
+ port_vector_count = 0
+
+ for item in self.input_port:
+ if self.port_vector_info[port_vector_count]:
+ components.append(
+ item.split(':')[0] + ": in std_logic_vector(" +
+ str(int(item.split(':')[1]) - int(1)) +
+ " downto 0);\n\t\t\t\t"
+ )
+ else:
+ components.append(
+ item.split(':')[0] + ": in std_logic;\n\t\t\t\t"
+ )
+
+ port_vector_count += 1
+ # if item.split(":")[1] != '1':
+ # components.append(
+ # item.split(':')[0] + ": in std_logic_vector(" +
+ # str(int(item.split(':')[1])-int(1)) + " downto 0);" +
+ # "\n\t\t\t\t"
+ # )
+ # else:
+ # components.append(
+ # item.split(':')[0] + ": in std_logic_vector(" +
+ # str(int(item.split(':')[1])-int(1)) + " downto 0);" +
+ # "\n\t\t\t\t"
+ # )
+ for item in self.output_port[:-1]:
+ if self.port_vector_info[port_vector_count]:
+ components.append(
+ item.split(':')[0] + ": out std_logic_vector(" +
+ str(int(item.split(':')[1]) - int(1)) +
+ " downto 0);\n\t\t\t\t"
+ )
+ else:
+ components.append(
+ item.split(':')[0] + ": out std_logic;\n\t\t\t\t"
+ )
+
+ port_vector_count += 1
+
+ if self.port_vector_info[port_vector_count]:
+ components.append(
+ self.output_port[-1].split(':')[0] +
+ ": out std_logic_vector(" +
+ str(int(self.output_port[-1].split(':')[1]) - int(1)) +
+ " downto 0)\n\t\t\t\t"
+ )
+ else:
+ components.append(self.output_port[-1].split(':')[0] +
+ ": out std_logic\n\t\t\t\t")
+ # if item.split(":")[1] != '1':
+ # components.append(item.split(':')[0]+":
+ # out std_logic_vector("
+ # +str(int(item.split(':')[1])-int(1))+" downto 0)\n\t\t\t\t")
+ # else:
+ # components.append(item.split(':')[0]+":
+ # out std_logic_vector("
+ # +str(int(item.split(':')[1])-int(1))+" downto 0)\n\t\t\t\t")
+
+ components.append(");\n")
+ components.append("\tend component;\n\n")
+
+ # Adding signals
+ signals = []
+ signals.append("\tsignal clk_s : std_logic := '0';\n")
+
+ port_vector_count = 0
+
+ for item in self.input_port:
+ if self.port_vector_info[port_vector_count]:
+ signals.append(
+ "\tsignal " + item.split(':')[0] + ": std_logic_vector(" +
+ str(int(item.split(':')[1]) - int(1)) + " downto 0);\n"
+ )
+ else:
+ signals.append(
+ "\tsignal " + item.split(':')[0] + ": std_logic;\n"
+ )
+ port_vector_count += 1
+
+ # if item.split(":")[1] != '1':
+ # signals.append("\tsignal "+item.split(':')[0]+":
+ # std_logic_vector("+str(int(item.split(':')[1])-
+ # int(1))+" downto 0);\n")
+ # else:
+ # signals.append("\tsignal "+item.split(':')[0]+":
+ # std_logic_vector("+str(int(item.split(':')[1])-
+ # int(1))+" downto 0);\n")
+
+ for item in self.output_port:
+ if self.port_vector_info[port_vector_count]:
+ signals.append(
+ "\tsignal " + item.split(':')[0] + ": std_logic_vector(" +
+ str(int(item.split(':')[1]) - int(1)) + " downto 0);\n"
+ )
+ else:
+ signals.append(
+ "\tsignal " + item.split(':')[0] + ": std_logic;\n"
+ )
+
+ port_vector_count += 1
+ # if item.split(":")[1] != '1':
+ # signals.append(
+ # "\tsignal " + item.split(':')[0] + ":std_logic_vector(" +
+ # str(int(item.split(':')[1]) - int(1)) + " downto 0);\n"
+ # )
+ # else:
+ # signals.append(
+ # "\tsignal " + item.split(':')[0] + ":std_logic_vector(" +
+ # str(int(item.split(':')[1]) - int(1)) + " downto 0);\n"
+ # )
+
+ # Adding mapping part
+ map = []
+ map.append("\tu1 : " + self.fname.split('.')[0] + " port map(\n")
+
+ for item in self.input_port:
+ map.append("\t\t\t\t" + item.split(':')[0] +
+ " => " + item.split(':')[0] + ",\n")
+
+ for item in self.output_port:
+ if self.output_port.index(item) == len(self.output_port) - 1:
+ map.append("\t\t\t\t" + item.split(':')[0] +
+ " => " + item.split(':')[0] + "\n")
+ else:
+ map.append("\t\t\t\t" + item.split(':')[0] +
+ " => " + item.split(':')[0] + ",\n")
+ map.append("\t\t\t);")
+
+ # Testbench Clock
+ tb_clk = "clk_s <= not clk_s after 5 us;\n\n"
+
+ # Adding Process block for Vhpi
+ process_Vhpi = []
+ process_Vhpi.append(
+ "process\n\t\tvariable sock_port : integer;" +
+ "\n\t\ttype string_ptr is access string;" +
+ "\n\t\tvariable sock_ip : string_ptr;" +
+ "\n\t\tbegin\n\t\tsock_port := sock_port_fun;" +
+ "\n\t\tsock_ip := new string'(sock_ip_fun);" +
+ "\n\t\tVhpi_Initialize(sock_port," +
+ "Pack_String_To_Vhpi_String(sock_ip.all));" +
+ "\n\t\twait until clk_s = '1';" +
+ "\n\t\twhile true loop\n\t\t\twait until clk_s = '0';" +
+ "\n\t\t\tVhpi_Listen;\n\t\t\twait for 1 us;\n\t\t\t" +
+ "Vhpi_Send;" +
+ "\n\t\tend loop;\n\t\twait;\n\tend process;\n\n"
)
- else:
- signals.append("\tsignal " + item.split(':')[0] + ": std_logic;\n")
- port_vector_count += 1
-
- # if item.split(":")[1] != '1':
- # signals.append("\tsignal "+item.split(':')[0]+":
- # std_logic_vector("+str(int(item.split(':')[1]) -
- # int(1))+" downto 0);\n")
- # else:
- # signals.append("\tsignal "+item.split(':')[0]+":
- # std_logic_vector("+str(int(item.split(':')[1]) -
- # int(1))+" downto 0);\n")
-
-
-for item in output_port:
- if port_vector_info[port_vector_count]:
- signals.append(
- "\tsignal " + item.split(':')[0] + ": std_logic_vector(" +
- str(int(item.split(':')[1]) - int(1)) + " downto 0);\n"
+
+ # Adding process block
+ process = []
+ process.append("\tprocess\n")
+ process.append("\t\tvariable count : integer:=0;\n")
+
+ for item in self.input_port:
+ process.append(
+ "\t\tvariable " + item.split(':')[0] + "_v : VhpiString;\n"
+ )
+
+ for item in self.output_port:
+ process.append(
+ "\t\tvariable " + item.split(':')[0] + "_v : VhpiString;\n"
+ )
+
+ process.append("\t\tvariable obj_ref : VhpiString;\n")
+ process.append("\tbegin\n")
+ process.append("\t\twhile true loop\n")
+ process.append("\t\t\twait until clk_s = '0';\n\n")
+
+ port_vector_count = 0
+
+ for item in self.input_port:
+ process.append(
+ '\t\t\tobj_ref := Pack_String_To_Vhpi_String("' +
+ item.split(':')[0] + '");\n'
+ )
+ process.append(
+ '\t\t\tVhpi_Get_Port_Value(obj_ref,' +
+ item.split(':')[0] + '_v,' + item.split(':')[1] + ');\n'
+ )
+
+ if self.port_vector_info[port_vector_count]:
+ process.append(
+ '\t\t\t' + item.split(':')[0] +
+ ' <= Unpack_String(' + item.split(':')[0] + '_v,' +
+ item.split(':')[1] + ');\n'
+ )
+ else:
+ process.append(
+ '\t\t\t' + item.split(':')[0] +
+ ' <= To_Std_Logic('+item.split(':')[0]+'_v'+');\n'
+ )
+
+ port_vector_count += 1
+ process.append("\n")
+
+ process.append('\t\t\twait for 1 us;\n')
+
+ for item in self.output_port:
+ if self.port_vector_info[port_vector_count]:
+ process.append(
+ '\t\t\t' + item.split(':')[0] +
+ '_v := Pack_String_To_Vhpi_String' +
+ '(Convert_SLV_To_String(' +
+ item.split(':')[0]+'));\n'
+ )
+ else:
+ process.append(
+ '\t\t\t' + item.split(':')[0] +
+ '_v := Pack_String_To_Vhpi_String(To_String(' +
+ item.split(':')[0]+'));\n'
+ )
+
+ port_vector_count += 1
+
+ process.append(
+ '\t\t\tobj_ref := Pack_String_To_Vhpi_String("' +
+ item.split(':')[0]+'");\n'
+ )
+ process.append(
+ '\t\t\tVhpi_Set_Port_Value(obj_ref,' +
+ item.split(':')[0] + '_v,' + item.split(':')[1] + ');\n'
+ )
+ process.append("\n")
+
+ process.append(
+ '\t\t\treport "Iteration - "' +
+ "& integer'image(count) severity note;\n"
)
- else:
- signals.append("\tsignal " + item.split(':')[0] + ": std_logic;\n")
- port_vector_count += 1
- # if item.split(":")[1] != '1':
- # signals.append("\tsignal "+item.split(':')[0]+":
- # std_logic_vector("+str(int(item.split(':')[1])-int(1))+" downto 0);\n")
- # else:
- # signals.append("\tsignal "+item.split(':')[0]+":
- # std_logic_vector("+str(int(item.split(':')[1])-int(1))+" downto 0);\n")
-
-# Adding mapping part
-map = []
-map.append("\tu1 : " + fname.split('.')[0] + " port map(\n")
-
-for item in input_port:
- map.append(
- "\t\t\t\t" + item.split(':')[0] + " => " + item.split(':')[0] + ",\n"
- )
-
-for item in output_port:
- if output_port.index(item) == len(output_port) - 1:
- map.append(
- "\t\t\t\t" + item.split(':')[0] + " => " + item.split(':')[0] + "\n"
+ process.append('\t\t\tcount := count + 1;\n')
+ process.append("\t\tend loop;\n")
+ process.append("\tend process;\n\n")
+ process.append("end architecture;")
+
+ # Writing all the components to testbench file
+ testbench.write(comment_vhdl)
+ testbench.write(tb_header)
+ testbench.write(tb_entity)
+ testbench.write(arch)
+
+ for item in components:
+ testbench.write(item)
+
+ for item in signals:
+ testbench.write(item)
+
+ testbench.write("\n\n")
+
+ testbench.write("begin\n\n")
+
+ for item in map:
+ testbench.write(item)
+
+ testbench.write("\n\t"+tb_clk)
+
+ for item in process_Vhpi:
+ testbench.write(item)
+
+ for item in process:
+ testbench.write(item)
+
+ testbench.close()
+
+ def createServerScript(self):
+
+ # ####### Creating and writing components in start_server.sh ####### #
+
+ start_server = open('start_server.sh', 'w')
+
+ start_server.write("#!/bin/bash\n\n")
+ start_server.write(
+ "###This server run ghdl testebench for infinite time till " +
+ "ngspice send END signal to stop it\n\n"
)
- else:
- map.append(
- "\t\t\t\t" + item.split(':')[0] + " => " + item.split(':')[0] + ",\n"
+ start_server.write(
+ "cd "+self.home+"/ngspice-nghdl/src/xspice/icm/ghdl/" +
+ self.fname.split('.')[0]+"/DUTghdl/\n"
)
-map.append("\t\t\t);")
-
-
-# Testbench Clock
-tb_clk = "clk_s <= not clk_s after 5 us;\n\n"
-
-# Adding Process block for Vhpi
-process_Vhpi = []
-process_Vhpi.append(
- "process\n\t\tvariable sock_port : integer;" +
- "\n\t\ttype string_ptr is access string;" +
- "\n\t\tvariable sock_ip : string_ptr;" +
- "\n\t\tbegin\n\t\tsock_port := sock_port_fun;" +
- "\n\t\tsock_ip := new string'(sock_ip_fun);" +
- "\n\t\tVhpi_Initialize(sock_port," +
- "Pack_String_To_Vhpi_String(sock_ip.all));" +
- "\n\t\twait until clk_s = '1';" +
- "\n\t\twhile true loop\n\t\t\twait until clk_s = '0';" +
- "\n\t\t\tVhpi_Listen;\n\t\t\twait for 1 us;\n\t\t\t" +
- "Vhpi_Send;" +
- "\n\t\tend loop;\n\t\twait;\n\tend process;\n\n"
-)
-
-# Adding process block
-process = []
-process.append("\tprocess\n")
-process.append("\t\tvariable count : integer:=0;\n")
-
-for item in input_port:
- process.append("\t\tvariable " + item.split(':')[0] + "_v : VhpiString;\n")
-
-for item in output_port:
- process.append("\t\tvariable " + item.split(':')[0] + "_v : VhpiString;\n")
-
-process.append("\t\tvariable obj_ref : VhpiString;\n")
-process.append("\tbegin\n")
-process.append("\t\twhile true loop\n")
-process.append("\t\t\twait until clk_s = '0';\n\n")
-
-port_vector_count = 0
-
-for item in input_port:
- process.append(
- '\t\t\tobj_ref := Pack_String_To_Vhpi_String("' +
- item.split(':')[0] + '");\n'
- )
- process.append(
- '\t\t\tVhpi_Get_Port_Value(obj_ref,' +
- item.split(':')[0] + '_v,' + item.split(':')[1] + ');\n'
- )
-
- if port_vector_info[port_vector_count]:
- process.append(
- '\t\t\t' + item.split(':')[0] +
- ' <= Unpack_String(' + item.split(':')[0] + '_v,' +
- item.split(':')[1] + ');\n'
+ start_server.write("chmod 775 sock_pkg_create.sh &&\n")
+ start_server.write("./sock_pkg_create.sh $1 $2 &&\n")
+ start_server.write("ghdl -a sock_pkg.vhdl &&\n")
+ start_server.write("ghdl -a "+self.fname+" &&\n")
+ start_server.write(
+ "ghdl -a "+self.fname.split('.')[0]+"_tb.vhdl &&\n"
)
- else:
- process.append(
- '\t\t\t' + item.split(':')[0] +
- ' <= To_Std_Logic('+item.split(':')[0]+'_v'+');\n'
+ start_server.write(
+ "ghdl -e -Wl,ghdlserver.o " + self.fname.split('.')[0] + "_tb &&\n"
)
+ start_server.write("./"+self.fname.split('.')[0]+"_tb")
- port_vector_count += 1
- process.append("\n")
+ start_server.close()
-process.append('\t\t\twait for 1 us;\n')
+ def createSockScript(self):
-for item in output_port:
- if port_vector_info[port_vector_count]:
- process.append(
- '\t\t\t' + item.split(':')[0] +
- '_v := Pack_String_To_Vhpi_String' +
- '(Convert_SLV_To_String(' +
- item.split(':')[0]+'));\n'
- )
- else:
- process.append(
- '\t\t\t' + item.split(':')[0] +
- '_v := Pack_String_To_Vhpi_String(To_String(' +
- item.split(':')[0]+'));\n'
- )
+ # ########### Creating and writing in sock_pkg_create.sh ########### #
- port_vector_count += 1
-
- process.append(
- '\t\t\tobj_ref := Pack_String_To_Vhpi_String("' +
- item.split(':')[0]+'");\n'
- )
- process.append(
- '\t\t\tVhpi_Set_Port_Value(obj_ref,' +
- item.split(':')[0] + '_v,' + item.split(':')[1] + ');\n'
- )
- process.append("\n")
-
-process.append(
- '\t\t\treport "Iteration - "' +
- "& integer'image(count) severity note;\n"
-)
-process.append('\t\t\tcount := count + 1;\n')
-process.append("\t\tend loop;\n")
-process.append("\tend process;\n\n")
-process.append("end architecture;")
-
-# Writing all the components to testbench file
-testbench.write(comment_vhdl)
-testbench.write(tb_header)
-testbench.write(tb_entity)
-testbench.write(arch)
-
-for item in components:
- testbench.write(item)
-
-for item in signals:
- testbench.write(item)
-
-testbench.write("\n\n")
-
-testbench.write("begin\n\n")
-
-for item in map:
- testbench.write(item)
-
-testbench.write("\n\t"+tb_clk)
-
-for item in process_Vhpi:
- testbench.write(item)
-
-for item in process:
- testbench.write(item)
-
-
-testbench.close()
-
-
-# ########### Creating and writing components in start_server.sh ########### #
-
-start_server = open('start_server.sh', 'w')
-
-start_server.write("#!/bin/bash\n\n")
-start_server.write(
- "###This server run ghdl testebench for infinite time till " +
- "ngspice send END signal to stop it\n\n"
-)
-start_server.write(
- "cd "+home+"/ngspice-nghdl/src/xspice/icm/ghdl/" +
- fname.split('.')[0]+"/DUTghdl/\n"
-)
-start_server.write("chmod 775 sock_pkg_create.sh &&\n")
-start_server.write("./sock_pkg_create.sh $1 $2 &&\n")
-start_server.write("ghdl -a sock_pkg.vhdl &&\n")
-start_server.write("ghdl -a "+fname+" &&\n")
-start_server.write("ghdl -a "+fname.split('.')[0]+"_tb.vhdl &&\n")
-start_server.write("ghdl -e -Wl,ghdlserver.o "+fname.split('.')[0]+"_tb &&\n")
-start_server.write("./"+fname.split('.')[0]+"_tb")
-
-start_server.close()
-
-
-# ############### Creating and writing in sock_pkg_create.sh ############### #
-
-sock_pkg_create = open('sock_pkg_create.sh', 'w')
-
-sock_pkg_create.write("#!/bin/bash\n\n")
-sock_pkg_create.write(
- "##This file creates sock_pkg.vhdl file and sets the port " +
- "and ip from parameters passed to it\n\n"
-)
-sock_pkg_create.write("echo \"library ieee;\n")
-sock_pkg_create.write("package sock_pkg is\n")
-sock_pkg_create.write("\tfunction sock_port_fun return integer;\n")
-sock_pkg_create.write("\tfunction sock_ip_fun return string;\n")
-sock_pkg_create.write("end;\n\n")
-sock_pkg_create.write("package body sock_pkg is\n")
-sock_pkg_create.write("\tfunction sock_port_fun return integer is\n")
-sock_pkg_create.write("\t\tvariable sock_port : integer;\n")
-sock_pkg_create.write("\t\t\tbegin\n")
-sock_pkg_create.write("\t\t\t\tsock_port := $1;\n")
-sock_pkg_create.write("\t\t\t\treturn sock_port;\n")
-sock_pkg_create.write("\t\t\tend function;\n\n")
-sock_pkg_create.write("\tfunction sock_ip_fun return string is\n")
-sock_pkg_create.write("\t\ttype string_ptr is access string;\n")
-sock_pkg_create.write("\t\tvariable sock_ip : string_ptr;\n")
-sock_pkg_create.write("\t\t\tbegin\n")
-sock_pkg_create.write('\t\t\t\tsock_ip := new string\'(\\"$2\\");\n')
-sock_pkg_create.write("\t\t\t\treturn sock_ip.all;\n")
-sock_pkg_create.write("\t\t\tend function;\n\n")
-sock_pkg_create.write("\t\tend package body;\" > sock_pkg.vhdl")
+ sock_pkg_create = open('sock_pkg_create.sh', 'w')
+
+ sock_pkg_create.write("#!/bin/bash\n\n")
+ sock_pkg_create.write(
+ "##This file creates sock_pkg.vhdl file and sets the port " +
+ "and ip from parameters passed to it\n\n"
+ )
+ sock_pkg_create.write("echo \"library ieee;\n")
+ sock_pkg_create.write("package sock_pkg is\n")
+ sock_pkg_create.write("\tfunction sock_port_fun return integer;\n")
+ sock_pkg_create.write("\tfunction sock_ip_fun return string;\n")
+ sock_pkg_create.write("end;\n\n")
+ sock_pkg_create.write("package body sock_pkg is\n")
+ sock_pkg_create.write("\tfunction sock_port_fun return integer is\n")
+ sock_pkg_create.write("\t\tvariable sock_port : integer;\n")
+ sock_pkg_create.write("\t\t\tbegin\n")
+ sock_pkg_create.write("\t\t\t\tsock_port := $1;\n")
+ sock_pkg_create.write("\t\t\t\treturn sock_port;\n")
+ sock_pkg_create.write("\t\t\tend function;\n\n")
+ sock_pkg_create.write("\tfunction sock_ip_fun return string is\n")
+ sock_pkg_create.write("\t\ttype string_ptr is access string;\n")
+ sock_pkg_create.write("\t\tvariable sock_ip : string_ptr;\n")
+ sock_pkg_create.write("\t\t\tbegin\n")
+ sock_pkg_create.write('\t\t\t\tsock_ip := new string\'(\\"$2\\");\n')
+ sock_pkg_create.write("\t\t\t\treturn sock_ip.all;\n")
+ sock_pkg_create.write("\t\t\tend function;\n\n")
+ sock_pkg_create.write("\t\tend package body;\" > sock_pkg.vhdl")