syst_graph.cpp
上传用户:jtjnyq9001
上传日期:2014-11-21
资源大小:3974k
文件大小:41k
源码类别:

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = syst_graph.cpp
  3. //
  4. #include <stdlib.h>
  5. #include <fstream>
  6. #include "syst_graph.h"
  7. #include "globals.h"
  8. #include "sigplot.h"
  9. //#include "sig_mgr.h"
  10. //#include "cntl_mgr.h"
  11. //#include "actsysgp.h"
  12. //#include "cmsg.h"
  13. //#include "reinit.h"
  14. #ifdef _DEBUG
  15.   extern ofstream *DebugFile;
  16. #endif
  17. extern SignalPlotter SigPlot;
  18. //extern Reinitializer Reinit;
  19. extern int PassNumber;
  20. extern int EnclaveNumber;
  21. extern int EnclaveOffset[10];
  22. extern PracSimModel *ActiveModel;
  23. //============================================
  24. // constructor
  25. SystemGraph::SystemGraph()
  26. {
  27.   Sdg_Vert_Descr = new std::vector<sdg_sig_desc_type*>;
  28.   Sdg_Edge_Descr = new std::vector<sdg_edge_desc_type*>;
  29.   Samp_Intvl = new std::vector<double>;
  30.   Block_Size = new std::vector<int>;
  31.   Syst_Lev_Models = new std::vector<PracSimModel*>;
  32.   Sig_Dep_Graph = new DirectedGraph;
  33.   Num_Regular_Sigs = 0;
  34.   return;
  35. }
  36. //============================================
  37. // destructor
  38. SystemGraph::~SystemGraph()
  39. {
  40. }
  41. //============================================
  42. void SystemGraph::MergeCurrModelGraph( ModelGraph* curr_mod_graph )
  43. {
  44.    std::vector<int> merged_verts;
  45.    int num_cmg_verts;
  46.    int cmg_vert_num;
  47.    int sdg_sig_num;
  48.    obj_id_type sdg_sig_id, cmg_sig_id;
  49.    SignalKinds_type cmg_vert_kind;
  50.    bool node_not_found;
  51.    double cmg_samp_intvl;
  52.    int cmg_block_size;
  53.    //------------------------------------------------------------
  54.    // First section of code merges the vertices from the current
  55.    // model graph (CMG) into the system dependency graph (SDG)
  56.    //
  57.    //  Check each signal from CSG to see if it's already in SDG
  58.    num_cmg_verts = curr_mod_graph->GetNumVerts();
  59.    //-----------------------------------------------------
  60.    //  This loop checks each signal from CMG to see if it's 
  61.    //  already in SDG
  62.    for(  cmg_vert_num = 0; 
  63.          cmg_vert_num < num_cmg_verts;
  64.          cmg_vert_num++) {
  65.       cmg_vert_kind = curr_mod_graph->GetVertexKind(cmg_vert_num);
  66.       cmg_sig_id = curr_mod_graph->GetVertexId(cmg_vert_num);
  67.       node_not_found = true;
  68.       int num_sdg_verts = Sig_Dep_Graph->GetNumVerts();
  69.       for( sdg_sig_num = 0; 
  70.            (sdg_sig_num < num_sdg_verts) & node_not_found; 
  71.            sdg_sig_num++) {
  72.          sdg_sig_id = Sig_Dep_Graph->GetVertexId(sdg_sig_num);
  73.          if( sdg_sig_id == cmg_sig_id ) {
  74.             //---------------------------------------
  75.             // this CMSG signal is already in SDG, so add its
  76.             // index (in SDG) to list of merged signals
  77.             merged_verts.push_back(sdg_sig_num);
  78.             //----------------------------------------
  79.             // If sampling rate is undefined for signal in SDG,
  80.             // copy value from CMG signal (which may or may not be 
  81.             // defined).  If sampling rate is defined for signal in SDG,
  82.             // check to see if there is a different value defined in
  83.             // CMG.  If there is, a fatal error condition exists.
  84.             cmg_samp_intvl = curr_mod_graph->GetSampIntvl(cmg_vert_num);
  85.             if(((Sdg_Vert_Descr->at(sdg_sig_num))->samp_intvl) == 0.0) {
  86.                ((Sdg_Vert_Descr->at(sdg_sig_num))->samp_intvl) = cmg_samp_intvl;
  87.             }
  88.             else {
  89.                if( (cmg_samp_intvl != 0.0) &&
  90.                    (cmg_samp_intvl != 
  91.                    ((Sdg_Vert_Descr->at(sdg_sig_num))->samp_intvl)) ) {
  92.                   // -- ERROR --
  93.                   *DebugFile << "Fatal error -- "
  94.                              << "incomsistent sampling rate for signal "
  95.                              << ((GenericSignal*)sdg_sig_id)->GetName() << endl;
  96.                   exit(1);
  97.                }
  98.             }
  99.             //---------------------------------------------------
  100.             //  If block size is undefined for signal in SDG,
  101.             //  copy value from CMG signal (which may or may not be
  102.             //  defined.  If block size is defined for signal in SDG,
  103.             //  check to see if there is a different value in CMG.
  104.             //  If there is, a fatal error condition exists.
  105.             cmg_block_size = curr_mod_graph->GetBlockSize(cmg_vert_num);
  106.             if( ((Sdg_Vert_Descr->at(sdg_sig_num))->block_size) == 0 ) {
  107.                ((Sdg_Vert_Descr->at(sdg_sig_num))->block_size) = cmg_block_size;
  108.             }
  109.             else {
  110.                if( (cmg_block_size != 0 ) &&
  111.                    (cmg_block_size != 
  112.                    ((Sdg_Vert_Descr->at(sdg_sig_num))->block_size) )) {
  113.                // -- ERROR --
  114.                *DebugFile << "Fatal error -- "
  115.                           << "inconsistent block size for signal "
  116.                           << ((GenericSignal*)sdg_sig_id)->GetName() << endl;
  117.                exit(1);
  118.                }
  119.             }
  120.             // no need to check remaining SDG signals for this CMSG signal
  121.             node_not_found = false;
  122.          } // end of if( sdg_sig_id == cmg_sig_id )
  123.       } // end of loop over sdg_sig_num
  124.       //-----------------------------------------------------
  125.       // If loop above completed without a match, we need
  126.       // to add CMG vertex to SDG
  127.       if( node_not_found ) {
  128.          // maybe...we should use the sig_desc_type structure
  129.          // in the CMG, then this would become a simple
  130.          // structure to structure copy
  131.          sdg_sig_desc_type* new_sig_desc = new sdg_sig_desc_type;
  132.          new_sig_desc->signal_id = 
  133.                      curr_mod_graph->GetSignalId(cmg_vert_num);
  134.          new_sig_desc->block_size = 
  135.                      curr_mod_graph->GetBlockSize(cmg_vert_num);
  136.          new_sig_desc->samp_intvl = 
  137.                      curr_mod_graph->GetSampIntvl(cmg_vert_num);
  138.          new_sig_desc->kind_of_signal = 
  139.                      curr_mod_graph->GetVertexKind(cmg_vert_num);
  140.          if(new_sig_desc->kind_of_signal == SK_REGULAR_SIGNAL) Num_Regular_Sigs++;
  141.          Sdg_Vert_Descr->push_back(new_sig_desc);
  142.          sdg_sig_num = Sig_Dep_Graph->AddVertex(cmg_sig_id);
  143.          merged_verts.push_back(sdg_sig_num);
  144.       }
  145.    } // end of loop over cmg_vert_num
  146.    //----------------------------------------------------------
  147.    //  at this point we are done adding vertices, and now begin
  148.    //  to add edges between these vertices as specified in the CMG
  149.    //
  150.    //  new edges in the SDG can only connect to vertices that were
  151.    //  just added or which matched vertices in the CMG
  152.    int sdg_fm_idx, sdg_to_idx;
  153.    int cmg_edge_num;
  154.    int existing_edge;
  155.    bool conn_is_feedback;
  156.    obj_id_type cmg_edge_id;
  157.    int num_merged_verts;
  158.    num_merged_verts = int(merged_verts.size());
  159.    for(  int cmg_fm_idx = 0; 
  160.          cmg_fm_idx < num_merged_verts; 
  161.          cmg_fm_idx++)  {
  162.       sdg_fm_idx = merged_verts.at(cmg_fm_idx);
  163.       conn_is_feedback = curr_mod_graph->ConnIsFeedback(cmg_fm_idx);
  164.       for( int cmg_to_idx = 0; 
  165.            cmg_to_idx < num_merged_verts; 
  166.            cmg_to_idx++) {
  167.          sdg_to_idx = merged_verts.at(cmg_to_idx);
  168.          cmg_edge_num = curr_mod_graph->GetEdgeNum(cmg_fm_idx, cmg_to_idx);
  169.          if(cmg_edge_num >= 0) {
  170.             //---------------------------------
  171.             // CMG contains an edge from vertex 'cmg_fm_idx'
  172.             // to vertex 'cmg_to_idx'
  173.             // See if ASG-SDG already contains an edge between
  174.             // the corresponding vertices.
  175.             existing_edge = 
  176.                   Sig_Dep_Graph->GetEdgeNum(sdg_fm_idx, sdg_to_idx);
  177.             if(existing_edge >= 0 ) {
  178.                double cmg_resamp = curr_mod_graph->GetResampRate(cmg_edge_num);
  179.               // double sdg_resamp = Sig_Dep_Graph->GetResampRate(existing_edge);
  180.                double sdg_resamp = (Sdg_Edge_Descr->at(existing_edge))->resamp_rate;;
  181.                if(cmg_resamp != sdg_resamp)
  182.                {
  183.                   // parallel edge exists in ASG-SDG -- not sure how to
  184.                   // handle -- see old listing for handling of edges
  185.                   // due to subordinate models
  186.                   *DebugFile << "parallel edge error" << endl;
  187.                   *DebugFile << "existing_edge = " << existing_edge << endl;
  188.                   *DebugFile << "cmg_fm_idx = " << cmg_fm_idx << endl;
  189.                   *DebugFile << "cmg_to_idx = " << cmg_to_idx << endl;
  190.                   exit(1);
  191.                }
  192.             }
  193.             //-----------------------------------------
  194.             // OK to add edge
  195.       
  196.             cmg_edge_id = curr_mod_graph->GetEdgeId(cmg_edge_num);
  197.             Sig_Dep_Graph->AddEdge( cmg_edge_id, 
  198.                                     sdg_fm_idx, 
  199.                                     sdg_to_idx);
  200.             sdg_edge_desc_type* new_edge_desc = new sdg_edge_desc_type;
  201.             new_edge_desc->model_id = (PracSimModel*)cmg_edge_id;
  202.             new_edge_desc->resamp_rate = 
  203.                      curr_mod_graph->GetResampRate(cmg_edge_num);
  204.             new_edge_desc->is_const_intvl = 
  205.                      curr_mod_graph->GetIsConstIntvl(cmg_edge_num);
  206.             new_edge_desc->delta_delay =
  207.                      curr_mod_graph->GetDelay(cmg_edge_num);
  208.             Sdg_Edge_Descr->push_back(new_edge_desc);
  209.          } // end of if(cmg_edge_num)
  210.       } // end of loop over cmg_to_idx
  211.    } // end of loop over cmg_fm_idx
  212.    return;
  213. }
  214. //========================================================
  215. void SystemGraph::DumpSDGraph(void)
  216. {
  217.    int sig_num, sig_num2, edge_num;
  218.    GenericSignal *sig_id;
  219.    PracSimModel *model_id;
  220.    int num_nodes = Sig_Dep_Graph->GetNumVerts();
  221.    int num_edges = Sig_Dep_Graph->GetNumEdges();
  222.    *DebugFile << "nIn SystemGraph::DumpSDGraph" << endl;
  223.    *DebugFile << "Num_SDG_Nodes = " << num_nodes << endl;
  224.    *DebugFile << "Vertices:" << endl;
  225.    *DebugFile << "index, Sdg_Vtx_Id, Signal Name, Samp Intvl, "
  226.               << "Block Size" << endl;
  227.    for( sig_num = 0; sig_num < num_nodes; sig_num++) {
  228.       sig_id = (Sdg_Vert_Descr->at(sig_num))->signal_id;
  229.       *DebugFile << sig_num << ")  "
  230.                  << sig_id << "  "
  231.                  << sig_id->GetName() << "  "
  232.                  << (Sdg_Vert_Descr->at(sig_num))->samp_intvl << "  "
  233.                  << (Sdg_Vert_Descr->at(sig_num))->block_size << endl;
  234.    }
  235.    *DebugFile << "nEdges:" << endl;
  236.    *DebugFile << "index, SDG edge model, Model Name, Resamp Rate, "
  237.               << "Delay" << endl;
  238.    for( edge_num = 0; edge_num < num_edges; edge_num ++) {
  239.       model_id = (Sdg_Edge_Descr->at(edge_num))->model_id;
  240.       *DebugFile << edge_num << ")  "
  241.                  << model_id << "  "
  242.                  << model_id->GetModelName() << ":" 
  243.                  << model_id->GetInstanceName() << "  "
  244.                  << (Sdg_Edge_Descr->at(edge_num))->resamp_rate << "  "
  245.                  << (Sdg_Edge_Descr->at(edge_num))->delta_delay << endl;
  246.    }
  247.    *DebugFile << "nAdjacency Matrix:" << endl;
  248.    for( sig_num = 0; sig_num < num_nodes; sig_num++) {
  249.       for( sig_num2 = 0; sig_num2 < num_nodes; sig_num2++) {
  250.          edge_num = Sig_Dep_Graph->GetEdgeNum(sig_num, sig_num2);
  251.          if( edge_num >= 0 ) {
  252.         *DebugFile << "Edge " << edge_num
  253.                    << " connects from vertex " << sig_num
  254.                    << " to vertex " << sig_num2 << endl;
  255.          }
  256.       }
  257.    }
  258. }
  259. //===================================================================
  260. void SystemGraph::ResolveSignalParms(void)
  261. {
  262.   int sig_num, unsorted_sig_num, base_sig_num, edge_num;
  263.   int num_base_sigs_used = 0;
  264.   bool base_sig_not_found;
  265.   double samp_rate;
  266.   int block_size;
  267.   GenericSignal *sig_id;
  268.   bool is_forward;
  269.   int num_nodes = Sig_Dep_Graph->GetNumVerts();
  270.   bool *used_as_base = new bool[num_nodes];
  271.   for( sig_num = 0; sig_num < num_nodes; sig_num++)
  272.     {
  273.     used_as_base[sig_num] = false;
  274.     }
  275.   this->TopoSortSDG();
  276.   while(num_base_sigs_used < Num_Regular_Sigs)
  277.     {
  278.     //---------------------------------------------------------------
  279.     // find base signal
  280.     base_sig_not_found = true;
  281.     for(unsorted_sig_num = 0; unsorted_sig_num < num_nodes; unsorted_sig_num++)
  282.       {
  283.       sig_num = Sorted_Sig_Nodes[unsorted_sig_num];
  284.       sig_id = (Sdg_Vert_Descr->at(sig_num))->signal_id;
  285.       samp_rate = (Sdg_Vert_Descr->at(sig_num))->samp_intvl;
  286.       if(samp_rate <= 0.0)
  287.         {
  288.         #ifdef _DEBUG
  289.         *DebugFile << sig_id->GetName()
  290.                   << " rejected because samp rate <= 0 ( "
  291.                   << samp_rate << " )" << endl;
  292.         #endif
  293.         continue;
  294.         }
  295.       block_size = (Sdg_Vert_Descr->at(sig_num))->block_size;
  296.       if(block_size <= 0.0)
  297.         {
  298.         #ifdef _DEBUG
  299.         *DebugFile << sig_id->GetName()
  300.                   << " rejected because block size <= 0 ( "
  301.                   << block_size << " )" << endl;
  302.         #endif
  303.         continue;
  304.         }
  305.       if(used_as_base[sig_num])
  306.         {
  307.         #ifdef _DEBUG
  308.         *DebugFile << sig_id->GetName()
  309.                   << " rejected because already used as base"
  310.                   << endl;
  311.         #endif
  312.         continue;
  313.         }
  314.       //
  315.       // if execution gets to here, we have found a useable base signal
  316.       //
  317.       base_sig_num = sig_num;
  318.       used_as_base[base_sig_num] = true;
  319.       num_base_sigs_used++;
  320.       base_sig_not_found = false;
  321.       break;
  322.       } // end of loop over unsorted_sig_num
  323.     if(base_sig_not_found)
  324.       {
  325.       (*DebugFile) << "Unable to find suitable base signal" << endl;
  326.       #ifdef _DEBUG
  327.         *DebugFile << "The following signals have not"
  328.                   << " been used as base signals:" << endl;
  329.         for(unsorted_sig_num = 0; unsorted_sig_num < num_nodes; unsorted_sig_num++)
  330.           {
  331.           sig_num = Sorted_Sig_Nodes[unsorted_sig_num];
  332.           if(used_as_base[sig_num]) continue;
  333.             sig_id = (Sdg_Vert_Descr->at(sig_num))->signal_id;
  334.             *DebugFile << "   " << sig_id->GetName() << endl;
  335.           }
  336.       #endif
  337.       exit(0);
  338.       }
  339.     #ifdef _DEBUG
  340.       sig_id = (Sdg_Vert_Descr->at(base_sig_num))->signal_id;
  341.       *DebugFile << "nbase signal is " << sig_id->GetName() << endl;
  342.     #endif
  343.     //---------------------------------------------------------
  344.     //  Work down the column corresponding to the base signal to
  345.     //  find inbound edges.  For each edge found, attempt to 
  346.     //  propagate parameters back to the edge's source signal
  347.     for( sig_num = 0; sig_num < num_nodes; sig_num++)
  348.       {
  349.       edge_num = Sig_Dep_Graph->GetEdgeNum( sig_num, base_sig_num );
  350.       if(edge_num < 0 ) continue;
  351.         //
  352.         //else
  353.         is_forward = false;
  354.         #ifdef _DEBUG
  355.           sig_id = (Sdg_Vert_Descr->at(sig_num))->signal_id;
  356.           *DebugFile << "looking backward to " << sig_id->GetName() << endl;
  357.         #endif
  358.         Propagate( base_sig_num, edge_num, sig_num, is_forward);
  359.       }
  360.     //-------------------------------------------------------------
  361.     //  Work across the row corresponding to the base signal to
  362.     //  find outbound edges.  For each edge found, attempt to
  363.     //  propagate parameters forward to the edge's destination signal.
  364.     for( sig_num = 0; sig_num < num_nodes; sig_num++)
  365.       {
  366.       edge_num = Sig_Dep_Graph->GetEdgeNum( base_sig_num, sig_num );
  367.       if(edge_num < 0 ) continue;
  368.         //
  369.         //else
  370.         is_forward = true;
  371.         #ifdef _DEBUG
  372.           sig_id = (Sdg_Vert_Descr->at(sig_num))->signal_id;
  373.           *DebugFile << "looking forward to " << sig_id->GetName() << endl;
  374.         #endif
  375.         Propagate( base_sig_num, edge_num, sig_num, is_forward);
  376.       }
  377.     } // end of while(num_base_sigs_used < Num_Regular_Sigs)
  378.   return;
  379. }
  380. //============================================================
  381. void SystemGraph::TopoSortSDG(void)
  382. {
  383.   int num_nodes = Sig_Dep_Graph->GetNumVerts();
  384.   Sorted_Sig_Nodes = new int[num_nodes];
  385.   for(int i=0; i<num_nodes; i++)
  386.     {
  387.     Sorted_Sig_Nodes[i] = i;
  388.     }
  389.   return;
  390. }
  391. //=======================================================================
  392. void SystemGraph::Propagate( int base_sig_num,
  393.                                    int edge_num,
  394.                                    int sig_num,
  395.                                    bool is_forward )
  396. {
  397.   double t_base, t_sig;
  398.   double r_edge;
  399.   int n_base, n_sig;
  400.   int r_def, t_def, n_def;
  401.   int config_key;
  402.   bool is_const_intvl;
  403.   t_base = (Sdg_Vert_Descr->at(base_sig_num))->samp_intvl;
  404.   n_base = (Sdg_Vert_Descr->at(base_sig_num))->block_size;
  405.   r_edge = (Sdg_Edge_Descr->at(edge_num))->resamp_rate;
  406.   is_const_intvl = (Sdg_Edge_Descr->at(edge_num))->is_const_intvl;
  407.   t_sig = (Sdg_Vert_Descr->at(sig_num))->samp_intvl;
  408.   n_sig = (Sdg_Vert_Descr->at(sig_num))->block_size;
  409.   r_def = 0;
  410.   t_def = 0;
  411.   n_def = 0;
  412.   if( r_edge > 0.0 ) r_def = 1;
  413.   if( t_sig > 0.0) t_def = 2;
  414.   if( n_sig >0 ) n_def = 4;
  415.   config_key = r_def + t_def + n_def;
  416.   if(is_forward) config_key +=8;
  417.   if(is_const_intvl) config_key +=16;
  418.   switch (config_key)
  419.     {
  420.     case 0: //backward, nothing defined
  421.       // no action possible
  422.       #ifdef _DEBUG
  423.         *DebugFile << "  case 0 - no action possible" << endl;
  424.       #endif
  425.       return;
  426.     case 1:  //backward, resampling rate is defined
  427.       // compute sampling rate : Tn = R * Tb
  428.       // compute block size : Nn = Nb / R
  429.       t_sig = r_edge * t_base;
  430.       n_sig = int(n_base / r_edge);
  431.       #ifdef _DEBUG
  432.         *DebugFile << " case 1:n"
  433.                   << "   new samp intvl = " << t_sig
  434.                   << "   new block size = " << n_sig
  435.                   << endl;
  436.       #endif
  437.       break;
  438.     case 2:   //backward, sampling interval defined
  439.       // compute resampling rate : R = Tn / Tb
  440.       // compute block size : Nn = Nb / R
  441.       r_edge = t_sig/t_base;
  442.       n_sig = int(n_base/r_edge);
  443.       #ifdef _DEBUG
  444.         *DebugFile << " case 2:n"
  445.                   << "   new block size = " << n_sig
  446.                   << "   new resamp rate = " << r_edge
  447.                   << endl;
  448.       #endif
  449.       break;
  450.     case 3:   //backward, resampling rate and 
  451.               //sampling interval are defined
  452.       // compute block size : Nn = Nb / R
  453.       // check sampling interval : (Tn == R * Tb)?
  454.       n_sig = int(n_base / r_edge);
  455.       if( t_sig != (r_edge * t_base))
  456.         { // error
  457.         #ifdef _DEBUG
  458.           *DebugFile << " error in case 3" << endl;
  459.         #endif
  460.         ErrorStream << "nn********* FATAL ERROR ************" << endl;
  461.         ErrorStream << "resampling rate in instance '"
  462.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetInstanceName() 
  463.                       << "' of model '" 
  464.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetModelName() 
  465.                       << "'n is inconsistent input/output sampling intervals" << endl;
  466.         exit(0);
  467.         }
  468.       #ifdef _DEBUG
  469.         *DebugFile << " case 3:n"
  470.                   << "   new block size = " << n_sig
  471.                   << endl;
  472.       #endif
  473.       break;
  474.     case 4:   //backward, block size is defined
  475.       // compute resampling rate : R = Nb / Nn
  476.       // compute sampling interval : Tn = R * Tb
  477.       r_edge = float(n_base) / n_sig;
  478.       t_sig = r_edge * t_base;
  479.       #ifdef _DEBUG
  480.         *DebugFile << " case 4:n"
  481.                   << "   new samp interval = " << t_sig
  482.                   << "   new resamp rate = " << r_edge
  483.                   << endl;
  484.       #endif
  485.       break;
  486.     case 5:   //backward, resampling rate and block size defined
  487.       // compute sampling interval : Tn = R * Tb
  488.       // check block size : (Nb == R * Nn)?
  489.       t_sig = r_edge * t_base;
  490.       if( n_base != (r_edge * n_sig))
  491.         { // error
  492.         #ifdef _DEBUG
  493.           *DebugFile << " error in case 5" << endl;
  494.         #endif
  495.         ErrorStream << "nn********* FATAL ERROR ************" << endl;
  496.         ErrorStream << "resampling rate in instance '"
  497.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetInstanceName() 
  498.                       << "' of model '" 
  499.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetModelName() 
  500.                       << "'n is inconsistent with input/output block sizes" << endl;
  501.         exit(0);
  502.         }
  503.       #ifdef _DEBUG
  504.         *DebugFile << " case 5:n"
  505.                   << "   new samp interval = " << t_sig
  506.                   << endl;
  507.       #endif
  508.       break;
  509.     case 6:   //backward, sampling interval and block size defined
  510.       // compute resampling rate : R = Tn / Tb
  511.       // check block size : (Nb == R * Nn)?
  512.       r_edge = t_sig / t_base;
  513.       if( n_base != (r_edge * n_sig))
  514.         { //error
  515.         #ifdef _DEBUG
  516.           *DebugFile << " error in case 6" << endl;
  517.         #endif
  518.         ErrorStream << "nn********* FATAL ERROR ************" << endl;
  519.         ErrorStream << "resampling rate in instance '"
  520.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetInstanceName() 
  521.                       << "' of model '" 
  522.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetModelName() 
  523.                       << "'n is inconsistent with input/output block sizes" << endl;
  524.         exit(0);
  525.         }
  526.       #ifdef _DEBUG
  527.         *DebugFile << " case 6:n"
  528.                   << "   new resamp rate = " << r_edge
  529.                   << endl;
  530.       #endif
  531.       break;
  532.     case 7:   //backward, all parameters are defined
  533.       // check : (Tn == R * Tb)?
  534.       // check : (Nb == R * Nn)?
  535.       if( t_sig != (r_edge * t_base))
  536.         { // error
  537.         #ifdef _DEBUG
  538.           *DebugFile << " error in case 7a" << endl;
  539.         #endif
  540.         ErrorStream << "nn********* FATAL ERROR ************" << endl;
  541.         ErrorStream << "resampling rate in instance '"
  542.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetInstanceName() 
  543.                       << "' of model '" 
  544.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetModelName() 
  545.                       << "'n is inconsistent with input/output sampling intervals" << endl;
  546.         exit(0);
  547.         }
  548.       if( n_base != ceil(r_edge * n_sig))
  549.         { // error
  550.         #ifdef _DEBUG
  551.           *DebugFile << " error in case 7b" << endl;
  552.         #endif
  553.         ErrorStream << "nn********* FATAL ERROR ************" << endl;
  554.         ErrorStream << "resampling rate in instance '"
  555.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetInstanceName() 
  556.                       << "' of model '" 
  557.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetModelName() 
  558.                       << "'n is inconsistent with input/output block sizes" << endl;
  559.         ErrorStream << "n_base = " << n_base << endl;
  560.         ErrorStream << "r_edge = " << r_edge << endl;
  561.         ErrorStream << "n_sig = " << n_sig << endl;
  562.         exit(0);
  563.         }
  564.       #ifdef _DEBUG
  565.         *DebugFile << " case 7 - all parameters defined" << endl;
  566.       #endif
  567.       break;
  568.     case 8:   //forward, nothing defined
  569.       // no action possible
  570.       #ifdef _DEBUG
  571.         *DebugFile << " case 8 - no action possible" << endl;
  572.       #endif
  573.       return;
  574.     case 9:   //forward, resampling rate is defined
  575.       // compute sampling interval : Tn = Tb / R
  576.       // compute block size : Nn = R * Nb
  577.       t_sig = t_base / r_edge;
  578.       n_sig = int(ceil(r_edge * n_base));
  579.       #ifdef _DEBUG
  580.         *DebugFile << " case 9:n"
  581.                   << "   new samp interval = " << t_sig
  582.                   << "   new block size = " << n_sig
  583.                   << endl;
  584.       #endif
  585.       break;
  586.     case 10:    //forward, sampling interval defined
  587.       // compute resampling rate : R = Tb / Tn
  588.       // compute block size : Nn = R * Nb
  589.       r_edge = t_base / t_sig;
  590.       n_sig = int(r_edge * n_base);
  591.       #ifdef _DEBUG
  592.         *DebugFile << " case 10:n"
  593.                   << "   new block size = " << n_sig
  594.                   << "   new resamp rate = " << r_edge
  595.                   << endl;
  596.       #endif
  597.       break;
  598.     case 11:    //forward, resampling rate and
  599.                 // sampling interval defined
  600.       // compute block size : Nn = R * Nb
  601.       // check sampling interval : (Tb == R * Tn)?
  602.       n_sig = int(r_edge * n_base);
  603.       if(t_base != r_edge * t_sig)
  604.         { // error
  605.         #ifdef _DEBUG
  606.           *DebugFile << " error in case 11" << endl;
  607.         #endif
  608.         ErrorStream << "nn********* FATAL ERROR ************" << endl;
  609.         ErrorStream << "resampling rate in instance '"
  610.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetInstanceName() 
  611.                       << "' of model '" 
  612.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetModelName() 
  613.                       << "'n is inconsistent with input/output sampling intervals" << endl;
  614.         exit(0);
  615.         }
  616.       #ifdef _DEBUG
  617.         *DebugFile << " case 11:n"
  618.                   << "   new samp interval = " << t_sig
  619.                   << "   new block size = " << n_sig
  620.                   << endl;
  621.       #endif
  622.       break;
  623.     case 12:    //forward, block size is defined
  624.       // compute resampling rate : R = Nn / Nb
  625.       // compute sampling interval : Tn = Tb / R
  626.       r_edge = n_sig / n_base;
  627.       t_sig = t_base / r_edge;
  628.       #ifdef _DEBUG
  629.         *DebugFile << " case 12:n"
  630.                   << "   new samp interval = " << t_sig
  631.                   << "   new resamp rate = " << r_edge
  632.                   << endl;
  633.       #endif
  634.       break;
  635.     case 13:    //forward, resampling rate and
  636.                 // block size are defined
  637.       // compute sampling interval : Tn = Tb / R
  638.       // check block size : (Nn == R * Nb)?
  639.       t_sig = t_base / r_edge;
  640.       if(n_sig != (r_edge * n_base))
  641.         { // error
  642.         #ifdef _DEBUG
  643.           *DebugFile << " error in case 13" << endl;
  644.         #endif
  645.         ErrorStream << "nn********* FATAL ERROR ************" << endl;
  646.         ErrorStream << "resampling rate in instance '"
  647.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetInstanceName() 
  648.                       << "' of model '" 
  649.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetModelName() 
  650.                       << "'n is inconsistent with input/output block sizes" << endl;
  651.         exit(0);
  652.         }
  653.       #ifdef _DEBUG
  654.         *DebugFile << " case 13:n"
  655.                   << "   new samp interval = " << t_sig
  656.                   << endl;
  657.       #endif
  658.       break;
  659.     case 14:    //forward, sampling interval and
  660.                 // block size are defined
  661.       // compute resampling rate : R = Tb / Tn
  662.       // check block size : (Nn == R * Nb)?
  663.       r_edge = t_base / t_sig;
  664.       if( n_sig != (r_edge * n_base))
  665.         { // error
  666.         #ifdef _DEBUG
  667.           *DebugFile << " error in case 14" << endl;
  668.           *DebugFile << "   ( n_sig != (r_edge * n_base))" << endl;
  669.           *DebugFile << "    n_sig = " << n_sig << endl;
  670.           *DebugFile << "    r_edge = " << r_edge << endl;
  671.           *DebugFile << "    n_base = " << n_base << endl;
  672.         #endif
  673.         ErrorStream << "nn********* FATAL ERROR ************" << endl;
  674.         ErrorStream << "resampling rate in instance '"
  675.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetInstanceName() 
  676.                       << "' of model '" 
  677.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetModelName() 
  678.                       << "'n is inconsistent with input/output block sizes" << endl;
  679.         exit(0);
  680.         }
  681.       #ifdef _DEBUG
  682.         *DebugFile << " case 14:n"
  683.                   << "   new resamp rate = " << r_edge
  684.                   << endl;
  685.       #endif
  686.       break;
  687.     case 15:    //forward, all parameters are defined
  688.       // check : (Tb == R * Tn)?
  689.       // check : (Nn == R * Nb)?
  690.       if( t_base != (r_edge * t_sig))
  691.         { // error
  692.         #ifdef _DEBUG
  693.           *DebugFile << " error in case 15a" << endl;
  694.         #endif
  695.         ErrorStream << "nn********* FATAL ERROR ************" << endl;
  696.         ErrorStream << "resampling rate in instance '"
  697.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetInstanceName() 
  698.                       << "' of model '" 
  699.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetModelName() 
  700.                       << "'n is inconsistent with input/output sampling intervals" << endl;
  701.         exit(0);
  702.         }
  703.       if( n_sig != (r_edge * n_base))
  704.         { // error
  705.         #ifdef _DEBUG
  706.           *DebugFile << " error in case 15b" << endl;
  707.         #endif
  708.         ErrorStream << "nn********* FATAL ERROR ************" << endl;
  709.         ErrorStream << "resampling rate in instance '"
  710.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetInstanceName() 
  711.                       << "' of model '" 
  712.                       << ((Sdg_Edge_Descr->at(edge_num))->model_id)->GetModelName() 
  713.                       << "'n is inconsistent with input/output block sizes" << endl;
  714.         ErrorStream << "n_base = " << n_base << endl;
  715.         ErrorStream << "r_edge = " << r_edge << endl;
  716.         ErrorStream << "n_sig = " << n_sig << endl;
  717.         exit(0);
  718.         }
  719.       #ifdef _DEBUG
  720.         *DebugFile << " case 15 - all parameters defined" << endl;
  721.       #endif
  722.       break;
  723.     case 16: //backward, constant interval,  nothing defined
  724.       // no action possible
  725.       #ifdef _DEBUG
  726.         *DebugFile << "  case 16 - no action possible" << endl;
  727.       #endif
  728.       return;
  729.     case 17:  //backward, constant interval, resampling rate is defined
  730.       // constant sampling rate : Tn = Tb
  731.       // compute block size : Nn = ceil(Nb / R)
  732.       t_sig = t_base;
  733.       n_sig = int(ceil(n_base / r_edge));
  734.       #ifdef _DEBUG
  735.         *DebugFile << " case 17:n"
  736.                   << "   new block size = " << n_sig
  737.                   << endl;
  738.       #endif
  739.       break;
  740.     case 18:   //backward, constant interval, sampling interval defined
  741.       // compute resampling rate : R = Tn / Tb
  742.       //      this is not really constant interval if Tn != Tb
  743.       // compute block size : Nn = ceil(Nb / R)
  744.       r_edge = t_sig/t_base;
  745.       n_sig = int(ceil(n_base/r_edge));
  746.       #ifdef _DEBUG
  747.         *DebugFile << " case 18:n"
  748.                   << "   new block size = " << n_sig
  749.                   << "   new resamp rate = " << r_edge
  750.                   << endl;
  751.       #endif
  752.       break;
  753.     case 19:   //backward, constant interval, resampling rate and 
  754.               //sampling interval are defined
  755.       // compute block size : Nn = ceil(Nb / R)
  756.       n_sig = int(ceil(n_base / r_edge));
  757.       #ifdef _DEBUG
  758.         *DebugFile << " case 19:n"
  759.                   << "   new block size = " << n_sig
  760.                   << endl;
  761.       #endif
  762.       break;
  763.     case 20:   //backward, constant interval, block size is defined
  764.       // compute resampling rate : R = Nb / Nn
  765.       // constant sampling interval : Tn = Tb
  766.       r_edge = float(n_base) / n_sig;
  767.       t_sig = t_base;
  768.       #ifdef _DEBUG
  769.         *DebugFile << " case 20:n"
  770.                   << "   new samp interval = " << t_sig
  771.                   << "   new resamp rate = " << r_edge
  772.                   << endl;
  773.       #endif
  774.       break;
  775.     case 21:   //backward, constant interval, resampling rate and block size defined
  776.       // constant sampling interval : Tn = Tb
  777.       t_sig = t_base;
  778.       #ifdef _DEBUG
  779.         *DebugFile << " case 21:n"
  780.                   << "   new samp interval = " << t_sig
  781.                   << endl;
  782.       #endif
  783.       break;
  784.     case 22:   //backward, constant interval, sampling interval and block size defined
  785.       // compute resampling rate : R = Nb / Nn
  786.       r_edge = n_base / n_sig;
  787.       #ifdef _DEBUG
  788.         *DebugFile << " case 22:n"
  789.                   << "   new resamp rate = " << r_edge
  790.                   << endl;
  791.       #endif
  792.       break;
  793.     case 23:   //backward, constant interval, all parameters are defined
  794.       #ifdef _DEBUG
  795.         *DebugFile << " case 23 - all parameters defined" << endl;
  796.       #endif
  797.       break;
  798.     case 24:   //forward, constant interval, nothing defined
  799.       // no action possible
  800.       #ifdef _DEBUG
  801.         *DebugFile << " case 24 - no action possible" << endl;
  802.       #endif
  803.       return;
  804.     case 25:   //forward, constant interval, resampling rate is defined
  805.       // constant sampling interval : Tn = Tb
  806.       // compute block size : Nn = ceil(R * Nb)
  807.       t_sig = t_base;
  808.       n_sig = int(ceil(r_edge * n_base));
  809.       #ifdef _DEBUG
  810.         *DebugFile << " case 25:n"
  811.                   << "   new samp interval = " << t_sig
  812.                   << "   new block size = " << n_sig
  813.                   << endl;
  814.       #endif
  815.       break;
  816.     case 26:    //forward, constant interval, sampling interval defined
  817.       // compute resampling rate : R = Tb / Tn
  818.       // compute block size : Nn = ceil(R * Nb)
  819.       r_edge = t_base / t_sig;
  820.       n_sig = int(ceil(r_edge * n_base));
  821.       #ifdef _DEBUG
  822.         *DebugFile << " case 26:n"
  823.                   << "   new block size = " << n_sig
  824.                   << "   new resamp rate = " << r_edge
  825.                   << endl;
  826.       #endif
  827.       break;
  828.     case 27:    //forward, constant interval, resampling rate and
  829.                 // sampling interval defined
  830.       // compute block size : Nn = ceil(R * Nb)
  831.       n_sig = int(ceil(r_edge * n_base));
  832.       #ifdef _DEBUG
  833.         *DebugFile << " case 27:n"
  834.                   << "   new block size = " << n_sig
  835.                   << endl;
  836.       #endif
  837.       break;
  838.     case 28:    //forward, constant interval, block size is defined
  839.       // compute resampling rate : R = Nn / Nb
  840.       // constant sampling interval : Tn = Tb
  841.       r_edge = n_sig / n_base;
  842.       t_sig = t_base;
  843.       #ifdef _DEBUG
  844.         *DebugFile << " case 28:n"
  845.                   << "   new samp interval = " << t_sig
  846.                   << "   new resamp rate = " << r_edge
  847.                   << endl;
  848.       #endif
  849.       break;
  850.     case 29:    //forward, constant interval, resampling rate and
  851.                 // block size are defined
  852.       // constant sampling interval : Tn = Tb
  853.       // check block size : (Nn == R * Nb)?
  854.       t_sig = t_base;
  855.       #ifdef _DEBUG
  856.         *DebugFile << " case 29:n"
  857.                   << "   new samp interval = " << t_sig
  858.                   << endl;
  859.       #endif
  860.       break;
  861.     case 30:    //forward, constant interval, sampling interval and
  862.                 // block size are defined
  863.       // compute resampling rate : R = Nn / Nb
  864.       r_edge = n_sig / n_base;
  865.       #ifdef _DEBUG
  866.         *DebugFile << " case 30:n"
  867.                   << "   new resamp rate = " << r_edge
  868.                   << endl;
  869.       #endif
  870.       break;
  871.     case 31:    //forward, constant interval, all parameters are defined
  872.       #ifdef _DEBUG
  873.         *DebugFile << " case 31 - all parameters defined" << endl;
  874.       #endif
  875.       break;
  876.     default:
  877.       *DebugFile << "Fatal Error in Propagate()" << endl;
  878.       exit(0);
  879.       
  880.     } // end of switch on config_key
  881.       // check for integer block size
  882. //  if( (int(r_edge * n_sig)) != n_base )
  883. //    { // errror
  884. //    *DebugFile << "base block size = " << n_base << endl;
  885. //    *DebugFile << "resampling rate = " << r_edge << endl;
  886. //    *DebugFile << "calculated block size = " << (float(n_base)/r_edge) 
  887. //              << endl;
  888. //    }
  889.   (Sdg_Vert_Descr->at(sig_num))->samp_intvl = t_sig;
  890.   (Sdg_Vert_Descr->at(sig_num))->block_size = n_sig;
  891.   (Sdg_Edge_Descr->at(edge_num))->resamp_rate = r_edge;
  892.   return;
  893. }
  894. //====================================================================
  895. //  Set the propagated values of signal parameters within each
  896. //  individual signal object
  897. void SystemGraph::DistributeSignalParms(void)
  898. {
  899.   int sig_num, block_size;
  900.   GenericSignal *sig_id;
  901.   double samp_intvl;
  902.   int num_nodes = Sig_Dep_Graph->GetNumVerts();
  903.   for( sig_num = 0; sig_num < num_nodes; sig_num++)
  904.     {
  905.     if( ((Sdg_Vert_Descr->at(sig_num))->kind_of_signal) != SK_REGULAR_SIGNAL) continue;
  906.       //
  907.       // else
  908.       sig_id = (Sdg_Vert_Descr->at(sig_num))->signal_id;
  909.       block_size = (Sdg_Vert_Descr->at(sig_num))->block_size;
  910.       sig_id->SetBlockSize( block_size );
  911.       //buffer_size = (Sdg_Vert_Descr->at(sig_num))->buffer_size;
  912.       //sig_id->SetBufferSize( buffer_size );
  913.       samp_intvl = (Sdg_Vert_Descr->at(sig_num))->samp_intvl;
  914.       sig_id->SetSampIntvl( samp_intvl );
  915.     }
  916.   return;
  917. }
  918. //====================================================================
  919. void SystemGraph::AllocateStorageBuffers(void)
  920. {
  921.   int sig_num;
  922.   GenericSignal *sig_id;
  923.   int num_nodes = Sig_Dep_Graph->GetNumVerts();
  924.   for(sig_num = 0; sig_num < num_nodes; sig_num++)
  925.     {
  926.     //------------------------------------------------
  927.     // don't consider dummy signals
  928.     if( ((Sdg_Vert_Descr->at(sig_num))->kind_of_signal) != SK_REGULAR_SIGNAL) continue;
  929.       //
  930.       // else
  931.       sig_id = (Sdg_Vert_Descr->at(sig_num))->signal_id;
  932.       sig_id->AllocateSignalBuffer();
  933.     }
  934. }
  935. //============================================================
  936. void SystemGraph::InitializeReadPtrs(void)
  937. {
  938.   GenericSignal* sig_id;
  939.   int num_sigs = Sig_Dep_Graph->GetNumVerts();
  940.   for(int sig_num = 0; sig_num < num_sigs; sig_num++)
  941.     {
  942.     if( ((Sdg_Vert_Descr->at(sig_num))->kind_of_signal) != SK_REGULAR_SIGNAL ) continue;
  943.         //
  944.         // else
  945.         sig_id = (Sdg_Vert_Descr->at(sig_num))->signal_id;
  946.         sig_id->InitializeReadPtrs();
  947.     }
  948. }
  949. //===================================================================
  950. void SystemGraph::InitializeModels(void)
  951. {
  952.   PracSimModel *model_id;
  953.   *DebugFile << "In SystemGraph::InitializeModels()" << endl;
  954.   EnclaveNumber = 0;
  955.   int num_edges = Sig_Dep_Graph->GetNumEdges();
  956.   for( int edge_num = 0; edge_num < num_edges; edge_num ++)
  957.     {
  958.     model_id = (Sdg_Edge_Descr->at(edge_num))->model_id;
  959.     // note: this might pick up models more than once!
  960.     model_id->Initialize();
  961.     *DebugFile << "Initialized model " << model_id->GetModelName() << ":"
  962.                << model_id->GetInstanceName() << endl;
  963.     }
  964. }
  965. //==============================================================================
  966. void SystemGraph::DeleteModels(void)
  967. {
  968.   PracSimModel *model_id;
  969.   *DebugFile << "In SystemGraph::InitializeModels()" << endl;
  970.   int num_edges = Sig_Dep_Graph->GetNumEdges();
  971.   for(int model_num = 0; model_num < Num_Sys_Lev_Models; model_num++)
  972.     {
  973.     model_id = Syst_Lev_Models->at(model_num);
  974.     #ifdef _DEBUG
  975.     *DebugFile << "Deleting model " << model_id->GetModelName() << ":"
  976.                << model_id->GetInstanceName() << endl;
  977.     #endif
  978.     delete model_id;
  979.     }
  980. }
  981. //==============================================================================
  982. void SystemGraph::RunSimulation(void)
  983. {
  984.   int model_num;
  985.   int model_exec_status;
  986.   EnclaveNumber = 0;
  987.   EnclaveOffset[0] = 0;
  988.   for(model_num = 0; model_num < Num_Sys_Lev_Models; model_num++)
  989.     {
  990.     ActiveModel = Syst_Lev_Models->at(model_num);
  991.     #ifdef _DEBUG
  992.       *DebugFile << "ASG launching Execute for " << ActiveModel->GetModelName() 
  993.                   << ":" << ActiveModel->GetInstanceName() << endl;
  994.     #endif
  995.     model_exec_status = ActiveModel->Execute();
  996.     if( model_exec_status == _MES_AOK ) continue;
  997.       // else take action appropriate for returned status code
  998.       switch (model_exec_status)
  999.         {
  1000.         case _MES_RESTART:
  1001.           *DebugFile << "Restarting at top of Enclave 0" << endl;
  1002.           goto signal_update;
  1003.         default: //error
  1004.           cout << "unrecognized status returned by model execute method" << endl;
  1005.           exit(1);
  1006.         } // end of switch on model_exec_status
  1007.     }
  1008.   SigPlot.CollectData();
  1009.   //----------------------------------------------------------------------
  1010.   // Update signals
  1011. signal_update:
  1012.   int num_nodes = Sig_Dep_Graph->GetNumVerts();
  1013.   GenericSignal *sig_id;
  1014.   for( int sig_num = 0; sig_num < num_nodes; sig_num++)
  1015.     {
  1016.     if( ((Sdg_Vert_Descr->at(sig_num))->kind_of_signal) != SK_REGULAR_SIGNAL) continue;
  1017.       //
  1018.       // else
  1019.       sig_id = (Sdg_Vert_Descr->at(sig_num))->signal_id;
  1020.       sig_id->PassUpdate();
  1021.     }
  1022. }
  1023. //=========================================================================
  1024. void SystemGraph::RegisterModel(PracSimModel* model)
  1025. {
  1026.   if(model->GetNestDepth() == 1)
  1027.     {
  1028.     // add model to system level list
  1029.     Syst_Lev_Models->push_back(model);
  1030.     Num_Sys_Lev_Models++;
  1031.     }
  1032. }
  1033. //================================================================
  1034. void SystemGraph::AllocatePlotPointers(void)
  1035. {
  1036.   GenericSignal* sig_id;
  1037.   int num_sigs = Sig_Dep_Graph->GetNumVerts();
  1038.   for(int sig_num = 0; sig_num < num_sigs; sig_num++)
  1039.     {
  1040.     sig_id = (Sdg_Vert_Descr->at(sig_num))->signal_id;
  1041.     sig_id->SetupPlotSignal();
  1042.     }
  1043. }
  1044. //==========================================================
  1045. GenericSignal* SystemGraph::GetSignalId( char* sig_name)
  1046. {
  1047.   GenericSignal *sig_id;
  1048.   int num_sigs = Sig_Dep_Graph->GetNumVerts();
  1049.   for(int sig_num = 0; sig_num < num_sigs; sig_num++)
  1050.     {
  1051.     sig_id = (Sdg_Vert_Descr->at(sig_num))->signal_id;
  1052.     if( strcmp( sig_name, sig_id->GetName())) continue;
  1053.       return(sig_id);      
  1054.     }
  1055.   return(NULL);
  1056. }