| @@ -1,6 +1,8 @@ | |||
| import os, shutil | |||
| import re | |||
| from .manage import create_simulation | |||
| print('Creation of a new simulation project...') | |||
| ### Create the repository of the projects | |||
| @@ -25,43 +27,15 @@ while not project_repository: | |||
| if search(repository): | |||
| print('Illegal characters detected! Please enter a name with only the following characters : a-z, A-Z, 0-9, ".", "-", "_" and "/".') | |||
| else: | |||
| try: | |||
| os.makedirs(global_path+'/'+repository, exist_ok=False) | |||
| project_repository = repository | |||
| except FileExistsError: | |||
| print('Error, a project with this repository already exists!') | |||
| project_repository = repository | |||
| project_path = global_path+'/'+repository | |||
| ### Add contents in the project | |||
| files_from_ELMO = [ | |||
| 'Examples/elmoasmfunctions.o', | |||
| 'Examples/elmoasmfunctions.s', | |||
| 'Examples/elmoasmfunctionsdef.h', | |||
| 'Examples/DPATraces/MBedAES/vector.o', | |||
| ] | |||
| files_from_templates = [ | |||
| 'elmoasmfunctionsdef-extension.h', | |||
| 'Makefile', | |||
| 'project.c' | |||
| ] | |||
| for filename in files_from_ELMO: | |||
| shutil.copy('elmo/'+filename, project_path) | |||
| for filename in files_from_templates: | |||
| shutil.copy('templates/'+filename, project_path) | |||
| shutil.copy('elmo/'+'Examples/DPATraces/MBedAES/MBedAES.ld', project_path+'/'+'project.ld') | |||
| ### Create the project class | |||
| with open('templates/projectclass.py') as _source: | |||
| code = ''.join(_source.readlines()) | |||
| code = code.replace('{{PROJECTCLASSNAME}}', project_classname) | |||
| with open(project_path+'/'+'projectclass.py', 'w') as _dest: | |||
| _dest.write(code) | |||
| project_path = create_simulation(project_path, classname) | |||
| print('') | |||
| print('Creation complete !') | |||
| print(' - Project repository: {}'.format(os.path.abspath(project_path))) | |||
| print(' - Project class "{}" in {}'.format(project_classname, os.path.abspath(project_path+'/'+'projectclass.py'))) | |||
| print(' - Linker script: {}'.format(os.path.abspath(project_path+'/'+'project.ld'))) | |||
| print(' - Project repository: {}'.format(project_path)) | |||
| print(' - Project class "{}" in {}'.format(project_classname, project_path+'/projectclass.py')) | |||
| print(' - Linker script: {}'.format(project_path+'/project.ld'))) | |||
| print('') | |||
| print('Please don\'t to compile the project with the present Makefile before using it!') | |||
| @@ -1,6 +0,0 @@ | |||
| from .project_reader import Project | |||
| reader = ProjectReader() | |||
| projects = reader.get_projects() | |||
| for key, project in projects.items(): | |||
| globals()[key] = project | |||
| @@ -1,39 +0,0 @@ | |||
| from servicethread import PermanentServiceThread | |||
| import socket | |||
| class ListeningThread(PermanentServiceThread): | |||
| def __init__(self, host, port, threadclass, **kwargs): | |||
| super().__init__() | |||
| self.hostname = host | |||
| self.port = port | |||
| self.threadclass = threadclass | |||
| self.kwargs = kwargs | |||
| def execute(self): | |||
| self.tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |||
| self.tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) | |||
| self.tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) | |||
| # self.tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_ATTACH_REUSEPORT_CBPF, 1) | |||
| self.tcpsock.bind((self.hostname, self.port)) | |||
| self.tcpsock.listen(5) | |||
| print('[port][%s] Listening' % self.port) | |||
| while self.is_running(): | |||
| try: | |||
| (clientsocket, (ip, port)) = self.tcpsock.accept() | |||
| print('[port][{}] Accepted: {} <=> {}'.format( | |||
| self.port, | |||
| clientsocket.getsockname(), | |||
| clientsocket.getpeername(), | |||
| )) | |||
| newthread = self.threadclass(ip, port, clientsocket, **self.kwargs) | |||
| newthread.start() | |||
| except socket.timeout: | |||
| pass | |||
| def stop(self): | |||
| super().stop() | |||
| clientsocker = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |||
| clientsocker.connect( (self.hostname, self.port) ) | |||
| self.tcpsock.close() | |||
| print('[port][%s] Stop listening' % self.port) | |||
| @@ -3,7 +3,7 @@ import re | |||
| import inspect | |||
| import subprocess | |||
| def search_simulations(repository, criteria=lambda x:True, search_also_in_module=True): | |||
| def search_simulations_in_repository(repository, criteria=lambda x:True): | |||
| """ To search simulation classes in the 'repository' verifying the 'criteria' """ | |||
| projects = {} | |||
| @@ -35,15 +35,23 @@ def search_simulations(repository, criteria=lambda x:True, search_also_in_module | |||
| obj.set_project_directory(os.path.abspath(root)) | |||
| projects[key] = obj | |||
| if search_also_in_module: | |||
| module_path = os.path.dirname(os.path.abspath(__file__)) | |||
| module_projects = search_simulations(module_path+'/projects', criteria=lambda x:True, search_also_in_module=False) | |||
| for key, project in module_projects.items(): | |||
| if key not in projects: | |||
| projects[key] = project | |||
| return projects | |||
| def search_simulations_in_module(criteria=lambda x:True): | |||
| module_path = os.path.dirname(os.path.abspath(__file__)) | |||
| projects_path = module_path+'/projects' | |||
| return search_simulations_in_repository(projects_path, criteria) | |||
| def search_simulations(repository, criteria=lambda x:True): | |||
| projects = search_simulations_in_repository(repositories, criteria) | |||
| module_projects = search_simulations_in_module | |||
| for key, project in module_projects.items(): | |||
| if key not in projects: | |||
| projects[key] = project | |||
| return projects | |||
| class SimulationNotFoundError(Exception): | |||
| pass | |||
| @@ -67,7 +75,7 @@ def get_simulation(repository, classname=None): | |||
| def get_simulation_via_classname(classname): | |||
| return get_simulation('.', classname) | |||
| def create_simulation(repository, classname, verbose=True): | |||
| def create_simulation(repository, classname): | |||
| """ Create a simulation class """ | |||
| try: | |||
| os.makedirs(repository, exist_ok=False) | |||
| @@ -104,6 +112,8 @@ def create_simulation(repository, classname, verbose=True): | |||
| code = code.replace('{{PROJECTCLASSNAME}}', classname) | |||
| with open(project_path+'/'+'projectclass.py', 'w') as _dest: | |||
| _dest.write(code) | |||
| return os.path.abspath(project_path) | |||
| def execute_simulation(project, data=None): | |||
| """ Execute a simulation with 'data' """ | |||
| @@ -1,42 +0,0 @@ | |||
| from project_base import SimulationProject | |||
| import os, re | |||
| import inspect | |||
| PROJECTS_REPOSITORY = 'projects' | |||
| class ProjectReader: | |||
| def __init__(self): | |||
| pass | |||
| def get_projects(self): | |||
| projects = {} | |||
| for root, repositories, files in os.walk(PROJECTS_REPOSITORY): | |||
| for filename in files: | |||
| if re.fullmatch(r'.*project.*\.py', filename): | |||
| # Encapsulation the project | |||
| complete_filename = root+'/'+filename | |||
| globals = { | |||
| #'__builtins__': {'__build_class__': __build_class__}, | |||
| 'SimulationProject': SimulationProject, | |||
| } | |||
| locals = {} | |||
| # Read the project code | |||
| with open(complete_filename, 'r') as _file: | |||
| project = '\n'.join(_file.readlines()) | |||
| exec(project, globals, locals) | |||
| # Extract the simulations | |||
| for key, obj in locals.items(): | |||
| if inspect.isclass(obj) and issubclass(obj, SimulationProject): | |||
| if key in projects: | |||
| print('Warning! Multiplie simulation with the same name. Simulation ignored: {} in {}'.format(key, complete_filename[len(PROJECTS_REPOSITORY)+1:])) | |||
| else: | |||
| obj.set_project_directory(root[len(PROJECTS_REPOSITORY)+1:]) | |||
| projects[key] = obj | |||
| return projects | |||
| def get_project_classes(self): | |||
| return self.get_projects().values() | |||
| @@ -1,3 +1,12 @@ | |||
| ### In this file is defined a Python class to manipulate the simualtion project. | |||
| ### - This class must be inherited from th class 'SimulationProject' (no need to import it) | |||
| ### - You can use here the function "write(input_file, uint, nb_bits=16)" | |||
| ### to write an integer of 'nb_bits' bits in the 'input_file' (no need to import it too). | |||
| ### To get this simulation class in Python scripts, please use the functions in manage.py as | |||
| ### - search_simulations(repository) | |||
| ### - get_simulation(repository, classname=None) | |||
| ### - get_simulation_via_classname(classname) | |||
| class KyberNTTSimulation(SimulationProject): | |||
| @classmethod | |||
| def get_binary(cl): | |||
| @@ -1,5 +1,5 @@ | |||
| from listeningthread import ListeningThread | |||
| from executorthread import ExecutorThread | |||
| from .servicethread import ListeningThread | |||
| from .executorthread import ExecutorThread | |||
| def do_main_program(projects): | |||
| global thread, stop | |||
| @@ -15,10 +15,9 @@ thread = None | |||
| stop = False | |||
| # Information | |||
| from project_reader import ProjectReader | |||
| reader = ProjectReader() | |||
| projects = {sc.get_project_label(): sc for sc in reader.get_project_classes()} | |||
| print('Available projects: %s' % list(projects.keys())) | |||
| from .manage import search_simulations | |||
| projects = {sc.get_project_label(): sc for sc in search_simulations_in_module().values()} | |||
| print('Available module projects: %s' % list(projects.keys())) | |||
| print('') | |||
| # Execute | |||
| @@ -41,3 +41,39 @@ class PermanentServiceThread(ServiceThread): | |||
| self._is_running = False | |||
| class ListeningThread(PermanentServiceThread): | |||
| def __init__(self, host, port, threadclass, **kwargs): | |||
| super().__init__() | |||
| self.hostname = host | |||
| self.port = port | |||
| self.threadclass = threadclass | |||
| self.kwargs = kwargs | |||
| def execute(self): | |||
| self.tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |||
| self.tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) | |||
| self.tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) | |||
| # self.tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_ATTACH_REUSEPORT_CBPF, 1) | |||
| self.tcpsock.bind((self.hostname, self.port)) | |||
| self.tcpsock.listen(5) | |||
| print('[port][%s] Listening' % self.port) | |||
| while self.is_running(): | |||
| try: | |||
| (clientsocket, (ip, port)) = self.tcpsock.accept() | |||
| print('[port][{}] Accepted: {} <=> {}'.format( | |||
| self.port, | |||
| clientsocket.getsockname(), | |||
| clientsocket.getpeername(), | |||
| )) | |||
| newthread = self.threadclass(ip, port, clientsocket, **self.kwargs) | |||
| newthread.start() | |||
| except socket.timeout: | |||
| pass | |||
| def stop(self): | |||
| super().stop() | |||
| clientsocker = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |||
| clientsocker.connect( (self.hostname, self.port) ) | |||
| self.tcpsock.close() | |||
| print('[port][%s] Stop listening' % self.port) | |||
| @@ -1,3 +1,12 @@ | |||
| ### In this file is defined a Python class to manipulate the simualtion project. | |||
| ### - This class must be inherited from th class 'SimulationProject' (no need to import it) | |||
| ### - You can use the function "write(input_file, uint, nb_bits=16)" | |||
| ### to write an integer of 'nb_bits' bits in the 'input_file'. | |||
| ### To get this simulation class in Python scripts, please use the functions in manage.py as | |||
| ### - search_simulations(repository) | |||
| ### - get_simulation(repository, classname=None) | |||
| ### - get_simulation_via_classname(classname) | |||
| class {{PROJECTCLASSNAME}}(SimulationProject): | |||
| @classmethod | |||
| def get_binary(cl): | |||