index{fichier des directives de simulation} Ce fichier est lu (et son contenu exploité) par un appel à la fonction ParseDirectiveFile. Cette fonction prend en argument le nom physique du fichier. Cet appel ne peut figurer que dans le programme principal.int main(int argc, char* argv[]) { ... ParseParameterFile(argv[1]); ParseSimulationFile(argv[2]); ... ParseDirectiveFile(argv[5]); //pCurrentSim->Run(); ... }Le nom du fichier peut figurer dans l'instruction (et donc compilé) ou, plus généralement, être passé en argument de la ligne de commande :
./main sim1.par sim1.sim sim1.osp sim1.str sim1.dirDans le programme principal, l'appel à ParseDirectiveFile doit figurer après l'appel à ParseParameterFile si une directive (notamment celle qui lance l'éxécution par Run) requiert que des paramètres du système soient déjà connus en mémoire (donc accessibles par Get..ParameterValue).
De même, il doit figurer après l'appel à ParseSimulationFile si est déclarée une directive d'éxécution (par Run), laquelle requiert l'instanciation préalable d'une instance de Simulation.
Le fichier des directives de simulation est une suite de phrases, dont la syntaxe est la suivante :
<fichier> ::= <phrase>* <phrase> ::= <ligne_trace> | <ligne_chrono> | <ligne_message> | <parse_param> | <parse_os> | <parse_struct> | <init_rand> | <init_simu> | <run_simu> | <recup_mem> | <display_os> | <report_mem> | <ligne_exit> <ligne_trace> ::= TRACE <mode_trace> <fin> <mode_trace> ::= PARSING | NO_PARSING | ACTION | NEWDEL <ligne_chrono> ::= CHRONO <instr_chrono> <fin> | CHRONO DISPLAY [<message>] <fin> <instr_chrono> ::= INIT | START | PAUSE | CLOSE <message> ::= <submessage>* <submessage> ::= <chaine> | <multichaine> | <format> | ENDL | TAB | CLOCK <chaine> ::= [a-zA-Z][a-zA-Z0-9\_\.]* <multichaine> ::= "<chaine_m>" <chaine_m> ::= [a-zA-Z(\ )*][a-zA-Z0-9\_\.\ ]* <format> ::= "<chaine_f>" <chaine_f> ::= [a-zA-Z0-9\+\*\/\,\_\.\:\!\?\%\'\"\ \=\\]* <ligne_message> ::= MESSAGE <message> <fin> <parse_param> ::= LECTURE PARAMETRE dir_path <fin> <dir_path> ::= "[/]<etage>*" <etage> ::= <chaine>/ | ../ <chaine> ::= [a-zA-Z][a-zA-Z0-9\_\.]* <parse_os> ::= LECTURE OUTPUTSPEC dir_path <fin> <parse_struct> ::= LECTURE STRUCTURE dir_path <fin> <init_rand> ::= INITRAND <entier> <fin> | INITRAND <fin> <init_simu> ::= INIT SIMULATION dir_path <fin> <run_simu> ::= RUN [<entier>] <fin> <recup_mem> ::= DELETE <spec_recup> <fin> <spec_recup> ::= <spec_recup_entite> | MONITOR | PARAMETER | OUTPUTSPEC | FICHIER | SIMULATION | ALL <spec_recup_ent> ::= ENTITE [<nom_classe>] INSTANCE | ENTITE [<nom_classe>] CLASSE <nomclasse> ::= <chaine> | <multichaine> <display_os> ::= DISPLAY OUTPUTSPEC <spec_display_os> <fin> <spec_display_os> ::= <spec_dspl_ent> | PROCESS | CPROCESS | DPROCESS | EVENT <spec_dspl_ent> ::= ENTITE [<nom_classe>] <report_mem> ::= RAPPORT MEMOIRE <fin> <ligne_exit> ::= EXIT <fin> <fin> ::= ;
- <ligne_trace> permet d'activer ou de désactiver une fonction de trace des actions de lecture/interprétation. L'option ACTION donne la valeur TRACE_ACTION_ON à la variable globale gTraceActionMode. L'option NEWDEL donne la valeur TRACE_NEWDEL_ON à la variable globale gTraceNewDelMode (voir page 'Fonctions globales/Interprétation des arguments de la commande de simulation').
- <ligne_chrono> permet de gérer un chronomètre. L'option INIT crée le chronomètre et initialise le compteur de temps à zéro. L'option START déclenche le chronomètre après la création ou un arrêt provisoire. L'option PAUSE l'arrête provisoirement et l'option CLOSE l'arrête définitivement. L'option PAUSE calcule le temps écoulé depuis le dernier déclenchement et ajoute cette valeur au compteur de temps. Bien noter que donner deux instructions PAUSE successives sans instruction START entre les deux a le même effet qu'avoir donné seulement la seconde instruction PAUSE. A une option INIT doit correspondre une et une seule option CLOSE. L'option DISPLAY affiche la valeur du compteur de temps, c'est-à-dire le temps cumulé sur les couples 'déclenchement/arrêt' successifs. On peut inclure un message dans la ligne affichée, avant l'indication du temps. Ce message peut comprendre des tabulations (option TAB), des retours à la ligne (option ENDL) ou enfin l'indication de la valeur de l'horloge de la simulation (option CLOCK).
- <ligne_message> affiche un message sur la sortie standard, construit comme ceux associés à un chronométrage.
- <parse_param> demande la lecture/interprétation d'un fichier des paramètres du système.
- <init_rand> initialise une série de nombres pseudo-aléatoires par un appel à srand(<entier>) ou srand(<valeur de paramètre>), ou bien par un appel à srand((int)getpid()) si l'entier n'est pas fourni ou est égal à 0. Utile pour provoquer des séries différentes (par la fonction RandomInteger) lors de simulations successives. Les tirages aléatoires effectués avant l'interprétation de cette ligne (notamment ceux dans le fichier de la structure du système) ne sont pas gérés par cette graine. La graine peut aussi être initialisée dans le fichier des paramètres de la simulation. (voir page 'Le fichier des spécifications de simulation').
- <init_simu> demande la lecture/interprétation d'un fichier de spécification de la simulation.
- <parse_struct> demande la lecture/interprétation d'un fichier de description de la structure du système.
- <parse_os> demande la lecture/interprétation d'un fichier de spécifications de sortie. Cette demande doit figurer après la spécification de la simulation, si celle-ci détermine (par le mot-clé OUT_DIR) le répertoire d'accueil des fichiers de sortie.
- <run_simu> provoque l'invocation de la méthode Run sur la simulation courante.
- <recup_mem> provoque, selon le contenu de <spec_recup>, l'invocation des fonctions suivantes : DeleteMonitors, DeleteParameters, DeleteOutputSpecs, DeleteFileInstances.
Avec le mot-clé SIMULATION, on invoque delete pCurrentSim;.
Avec les mots-clés ENTITE et CLASSE, on invoque DeleteEntityClasses, argumenté ou non avec le symbole de la classe dont le nom est <nom_classe>.
Avec les mots-clés ENTITE et INSTANCE, on invoque DeleteEntityInstances, argumenté ou non avec le symbole de la classe dont le nom est <nom_classe>.
Avec le mot-clé ALL, on invoque DeleteAll();.- <display_os> provoque, selon le mot-clé, l'invocation d'une des fonctions de transfert sur fichier des informations sauvegardées en mémoire au titre des spécifications de sortie (voir page 'Les spécifications de sortie/Fonctions'). \ Avec le mot-clé ALL, on invoque DisplayAllOutputSpecs().
- <report_mem> provoque l'invocation de la fonction MemoryReport
- <ligne_exit> fait que les lignes suivantes sont ignorées, comme un commentaire.
Un exemple de fichier de directives est le suivant :
TRACE PARSING; //TRACE NEWDEL; //TRACE ACTION; CHRONO INIT; CHRONO START; LECTURE PARAMETRE "parametres"; INIT SIMULATION "initSim"; LECTURE STRUCTURE "structure"; LECTURE OUTPUTSPEC "outspec.std"; RUN 1000; MESSAGE ENDL + "temps simule = " + HORLOGE + ENDL; CHRONO DISPLAY ENDL + "duree de la simulation = "; MESSAGE ENDL; DISPLAY OUTPUTSPEC EVENT; DISPLAY OUTPUTSPEC DPROCESS; DISPLAY OUTPUTSPEC CPROCESS; DISPLAY OUTPUTSPEC ENTITE entity; MESSAGE ENDL + "fin sauvegarde des sorties" + ENDL; DELETE PARAMETRE; DELETE OUTPUTSPEC; DELETE ENTITE INSTANCE; DELETE MONITOR; DELETE SIMULATION; RAPPORT MEMOIRE; DELETE ENTITE CLASSE; MESSAGE ENDL + "fin nettoyage" + ENDL; CHRONO CLOSE;Noter que le nom de classe entity est celui de la classe de base Entity. On demande alors la sauvegarde d'informations pour toutes les classes d'entités