⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 restoration_proc.em.c

📁 实验室前辈用OPNET做的光突发交换网络的仿真实验
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <opnet.h>
#include <ema.h>
#include <opnet_emadefs.h>
#include <opnet_constants.h>



/* array for all textlist attributes in model */
Prg_List*		prg_lptr [23];

/* array for all objects in model */
EmaT_Object_Id		obj [42];



int
main (int argc, char* argv [])
	{
	EmaT_Model_Id			model_id;
	int					i;

	/* initialize EMA package */
	Ema_Init (EMAC_MODE_ERR_PRINT, argc, argv);

	/* create an empty model */
	model_id = Ema_Model_Create (MOD_PROCESS);



	/* create all objects */
	obj [0] = Ema_Object_Create (model_id, OBJ_ATTR_PROPS);
	obj [1] = Ema_Object_Create (model_id, OBJ_PR_ATTR_ASSGN);
	obj [2] = Ema_Object_Create (model_id, OBJ_PR_ATTR_ASSGN);
	obj [3] = Ema_Object_Create (model_id, OBJ_PR_ATTR_ASSGN);
	obj [4] = Ema_Object_Create (model_id, OBJ_PR_ATTR_ASSGN);
	obj [5] = Ema_Object_Create (model_id, OBJ_PR_ATTR_ASSGN);
	obj [6] = Ema_Object_Create (model_id, OBJ_PR_ATTR_ASSGN);
	obj [7] = Ema_Object_Create (model_id, OBJ_PR_ATTR_ASSGN);
	obj [8] = Ema_Object_Create (model_id, OBJ_PR_ATTR_ASSGN);
	obj [9] = Ema_Object_Create (model_id, OBJ_ATTR_COMP_VALUE);
	obj [10] = Ema_Object_Create (model_id, OBJ_ATTR_COMP_OBJ);
	obj [11] = Ema_Object_Create (model_id, OBJ_PR_ATTR_ASSGN);
	obj [12] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [13] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [14] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [15] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [16] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [17] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [18] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [19] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [20] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [21] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [22] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [23] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [24] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [25] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [26] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [27] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [28] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [29] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [30] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [31] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [32] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [33] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [34] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [35] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [36] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [37] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [38] = Ema_Object_Create (model_id, OBJ_PR_STAT_DESC);
	obj [39] = Ema_Object_Create (model_id, OBJ_PR_STAT_DESC);
	obj [40] = Ema_Object_Create (model_id, OBJ_PR_STAT_DESC);
	obj [41] = Ema_Object_Create (model_id, OBJ_PR_STAT_DESC);


	/* assign attrs for object 'obj [0]' */
	/* create and init prg list 'prg_lptr [10]' */
	prg_lptr [10] = (Prg_List *)prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [0], 
		"units",                COMP_CONTENTS, "",
		"default value",        COMP_CONTENTS_TYPE, EMAC_DOUBLE,
		"default value",        COMP_CONTENTS, (double) 0,
		"comments",             COMP_CONTENTS, prg_lptr [10],
		"high limit",           COMP_CONTENTS, (double) 0,
		"low limit",            COMP_CONTENTS, (double) 0,
		"symbol map list",      COMP_INTENDED, EMAC_DISABLED,
		"flags",                COMP_CONTENTS, 0,
		"data type",            COMP_CONTENTS, 1,
		"count properties",     COMP_INTENDED, EMAC_DISABLED,
		"list attribute definitions",COMP_INTENDED, EMAC_DISABLED,
		EMAC_EOL);




	/* set the model level attributes */
	/* create and init prg list 'prg_lptr [0]' */
	prg_lptr [0] = (Prg_List *)prg_list_create ();
	prg_list_strings_append (prg_lptr [0], 
		"int	\\sequence_number_wait;",
		"",
		"int	\\sequence_number_current;",
		"",
		"int	\\node_address;",
		"",
		"int	\\nodes_total;",
		"",
		"int	\\queue_size;",
		"",
		"int	\\pk_rcvd[MAX_NODES];",
		"",
		"Distribution*	\\address_dist;",
		"",
		"Objid	\\sar_mod_objid;",
		"",
		"Objid	\\node_id;",
		"",
		"Objid	\\subnet_id;",
		"",
		"Objid	\\next_node_id;",
		"",
		"Stathandle	\\num_pk_gen_gsh;",
		"",
		"Stathandle	\\dup_pk_gsh;",
		"",
		"Route*	\\current_rptr;",
		"",
		"int	\\pk_count;",
		"",
		"Stathandle	\\pk_cnt_stathandle;",
		"",
		"Distribution *	\\start_dist;",
		"",
		"Distribution *	\\dtime_dist;",
		"",
		"Objid	\\dest_node_objid;",
		"",
		"Objid	\\node_objid;",
		"",
		"Objid	\\self_objid;",
		"",
		"Distribution*	\\wave_dist;",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [1]' */
	prg_lptr [1] = (Prg_List *)prg_list_create ();
	prg_list_strings_append (prg_lptr [1], 
		"Packet*		pkptr_burst;",
		"Packet*		pkptr;",
		"",
		"int			sequence_number_ack;",
		"int			sequence_number_rcv;",
		"int			source_address;",
		"int			destination_address;",
		"double		pk_size;",
		"",
		"int 		i,j,k;",
		"Route*		pk_rptr;",
		"Route*		p_min_rptr_copy;",
		"double		start_time;",
		"double		dtime_time;",
		"double		cur_time;",
		"int			subnet_ids[10];",
		"int			node_ids[20];",
		"int			num_nodes;",
		"int			userid;",
		"",
		"double 		EXTRA_TIME;",
		"int			ok_flag;",
		"int			wavelength_number;",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [2]' */
	prg_lptr [2] = (Prg_List *)prg_list_create ();
	prg_list_strings_append (prg_lptr [2], 
		"#include <string.h>",
		"#include <stdlib.h>",
		"#include <route.h>",
		"#define PK_IN_STRM 			0",
		"#define PK_OUT_STRM			0",
		"#define MAX_NODES			15",
		"",
		"",
		"#define END_SIM	(op_intrpt_type () == OPC_INTRPT_ENDSIM)",
		"#define BEG_SIM (op_intrpt_type () == OPC_INTRPT_BEGSIM)",
		"#define BURST_ARRIVAL (op_intrpt_type () == OPC_INTRPT_STRM && op_intrpt_strm () == PK_IN_STRM)",
		"",
		"",
		"int node_count = 0;   ",
		"//int num_pk_gen = 0;",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [3]' */
	prg_lptr [3] = (Prg_List *)prg_list_create ();
	/* create and init prg list 'prg_lptr [4]' */
	prg_lptr [4] = (Prg_List *)prg_list_create ();
	/* create and init prg list 'prg_lptr [5]' */
	prg_lptr [5] = (Prg_List *)prg_list_create ();
	prg_list_strings_append (prg_lptr [5], 
		"",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [6]' */
	prg_lptr [6] = (Prg_List *)prg_list_create ();
	/* create and init prg list 'prg_lptr [7]' */
	prg_lptr [7] = (Prg_List *)prg_list_create ();
	prg_list_strings_append (prg_lptr [7], 
		"",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [8]' */
	prg_lptr [8] = (Prg_List *)prg_list_create ();
	/* create and init prg list 'prg_lptr [9]' */
	prg_lptr [9] = (Prg_List *)prg_list_create ();
	prg_list_strings_append (prg_lptr [9], 
		"dr_ack",
		PRGC_NIL);

	Ema_Model_Attr_Set (model_id,
		"state vars",           COMP_CONTENTS, prg_lptr [0],
		"temp vars",            COMP_CONTENTS, prg_lptr [1],
		"header block",         COMP_CONTENTS, prg_lptr [2],
		"function block",       COMP_CONTENTS, prg_lptr [3],
		"diag block",           COMP_CONTENTS, prg_lptr [4],
		"termination block",    COMP_CONTENTS, prg_lptr [5],
		"global stat descs",    COMP_ARRAY_CONTENTS (0), obj [38],
		"global stat descs",    COMP_ARRAY_CONTENTS (1), obj [39],
		"local stat descs",     COMP_ARRAY_CONTENTS (0), obj [40],
		"local stat descs",     COMP_ARRAY_CONTENTS (1), obj [41],
		"child processes",      COMP_CONTENTS, prg_lptr [6],
		"model comments",       COMP_CONTENTS, prg_lptr [7],
		"ext fileset",          COMP_CONTENTS, prg_lptr [8],
		"packet formats",       COMP_CONTENTS, prg_lptr [9],
		"interface descriptions",COMP_INTENDED, EMAC_DISABLED,
		"attribute assignments",COMP_ARRAY_CONTENTS (0), obj [1],
		EMAC_EOL);

	Ema_Model_Attr_Set (model_id,
		"attribute assignments",COMP_ARRAY_CONTENTS (1), obj [2],
		"attribute assignments",COMP_ARRAY_CONTENTS (2), obj [3],
		"attribute assignments",COMP_ARRAY_CONTENTS (3), obj [4],
		"attribute assignments",COMP_ARRAY_CONTENTS (4), obj [5],
		"attribute assignments",COMP_ARRAY_CONTENTS (5), obj [6],
		"attribute assignments",COMP_ARRAY_CONTENTS (6), obj [7],
		"attribute assignments",COMP_ARRAY_CONTENTS (7), obj [8],
		"attribute assignments",COMP_ARRAY_CONTENTS (8), obj [11],
		"simulation attributes",COMP_INTENDED, EMAC_DISABLED,
		EMAC_EOL);


	/* create model level attribute extensions */
	Ema_Model_Attr_Add (model_id, "EXTRA_TIME", obj [0]);


	/* assign attrs for object 'obj [9]' */
	Ema_Object_Attr_Set (model_id, obj [9], 
		"count",                COMP_CONTENTS, 1,
		"list",                 COMP_ARRAY_CONTENTS (0), obj [10],
		EMAC_EOL);


	/* assign attrs for object 'obj [10]' */

	/* assign attrs for object 'obj [12]' */
	/* create and init prg list 'prg_lptr [11]' */
	prg_lptr [11] = (Prg_List *)prg_list_create ();
	prg_list_strings_append (prg_lptr [11], 
		"//pk_count = 0;",
		"//pk_cnt_stathandle = op_stat_reg(\"packet count\", OPC_STAT_INDEX_NONE, OPC_STAT_LOCAL);",
		"",
		"self_objid = op_id_self(); ",
		"node_id = op_topo_parent (self_objid);",
		"subnet_id = op_topo_parent(node_id);",
		"node_count++;",
		"node_address = node_count;",
		"op_ima_obj_attr_set (node_id, \"user id\", node_address);",
		"//printf(\"userid = %d\\n\",node_address);",
		"//getchar();",
		"",
		"gen_bcp[node_address] = 0;",
		"",
		"/* initialize the current sequence number to be zero */",
		"sequence_number_current = 0;",
		"",
		"/* initialize the waiting sequence number to be -1 */",
		"sequence_number_wait = -1;",
		"",
		"/* determine the total number of end nodes connceted to the network */",
		"nodes_total = op_topo_object_count (OPC_OBJTYPE_NDFIX);",
		"",
		"/* set up the address distribution */",
		"address_dist = op_dist_load (\"uniform_int\", 11, 14);",
		"",
		"/* initialize the counter of packets received from each source ",
		"for (i=0;i<MAX_NODES;i++)",
		"	{",
		"	pk_rcvd[i] = -1;",
		"	}",
		"*/",
		"/* register global stats and write an init point in each */",
		"//num_pk_gen_gsh = op_stat_reg (\"Global application packets generated (pks)\", OPC_STAT_INDEX_NONE, OPC_STAT_GLOBAL);",
		"//op_stat_write (num_pk_gen_gsh, num_pk_gen);",
		"",
		"for(j=1;j<15;j++)",
		"	{",
		"	use_backup_path[node_address][j] = 0;",
		"	}",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [12]' */
	prg_lptr [12] = (Prg_List *)prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [12], 
		"name",                 COMP_CONTENTS, "init",
		"Enter Execs",          COMP_CONTENTS, prg_lptr [11],
		"Exit Execs",           COMP_CONTENTS, prg_lptr [12],
		"status",               COMP_TOGGLE,   EMAC_ENABLED,
		"position",             COMP_CONTENTS, obj [13],
		"initial",              COMP_TOGGLE,   EMAC_ENABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [14]' */
	/* create and init prg list 'prg_lptr [13]' */
	prg_lptr [13] = (Prg_List *)prg_list_create ();
	/* create and init prg list 'prg_lptr [14]' */
	prg_lptr [14] = (Prg_List *)prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [14], 
		"name",                 COMP_CONTENTS, "wait",
		"Enter Execs",          COMP_CONTENTS, prg_lptr [13],
		"Exit Execs",           COMP_CONTENTS, prg_lptr [14],
		"status",               COMP_TOGGLE,   EMAC_DISABLED,
		"position",             COMP_CONTENTS, obj [15],
		"initial",              COMP_TOGGLE,   EMAC_DISABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [16]' */
	/* create and init prg list 'prg_lptr [15]' */
	prg_lptr [15] = (Prg_List *)prg_list_create ();
	prg_list_strings_append (prg_lptr [15], 
		"self_objid = op_id_self ();",
		"node_objid = op_topo_parent(self_objid);",
		"op_ima_obj_attr_get(node_objid, \"user id\", &userid);",
		"",
		"/* obtain the app packet*/",
		"pkptr_burst = op_pk_get (op_intrpt_strm());",
		"pk_size = op_pk_total_size_get (pkptr_burst);",
		"pk_size = (double)(pk_size / SCM);",
		"",
		"op_pk_destroy(pkptr_burst);",
		"",
		"if(userid == 6 || userid == 7 || userid == 8 || userid == 9)",
		"{",
		"",
		"pkptr = op_pk_create_fmt (\"restration_bcp\");",
		"						",
		"//num_pk_gen++;",
		"//op_stat_write (num_pk_gen_gsh, num_pk_gen);",
		"",
		"/* set the sequence number field for this packet */",
		"op_pk_nfd_set (pkptr, \"sequence number\", sequence_number_current);",
		"",
		"/* increment the current sequence number counter */",
		"sequence_number_current++;",
		"",
		"op_pk_nfd_set (pkptr, \"source address\", node_address);",
		"source_address = node_address;",
		"destination_address = op_dist_outcome (address_dist);",
		"",
		"",
		"op_pk_nfd_set (pkptr, \"destination address\", destination_address);",
		"",
		"",
		"if (min_rptr[source_address][destination_address] == OPC_NIL)",
		"	{",
		"	p_min_rptr_copy = OPC_NIL;",
		"	}",
		"else",
		"	{",
		"	p_min_rptr_copy = op_rte_route_copy (min_rptr[source_address][destination_address]);",
		"	}",
		"",
		"",
		"current_rptr = p_min_rptr_copy;",
		"",
		"if (current_rptr == OPC_NIL) ",
		"	{",
		"	op_pk_destroy (pkptr);",
		"	}",
		"",
		"else ",
		"	{",
		"	/* insert the route into the packet */",
		"	pk_rptr = op_rte_route_copy (current_rptr);",
		"	op_rte_pk_route_insert (pkptr, pk_rptr);",
		"	",
		"	num_nodes = op_rte_route_num_nodes (min_rptr[source_address][destination_address]);",
		"	dtime_time = (double) pk_size/RATE;",
		"	op_ima_obj_attr_get(self_objid, \"EXTRA_TIME\", &EXTRA_TIME);",
		"	start_time = (double) PROC_TIME*num_nodes+EXTRA_TIME;",
		"",
		"	op_pk_nfd_set (pkptr, \"start\", start_time);",
		"	op_pk_nfd_set (pkptr, \"dtime\", dtime_time);",
		"	op_pk_nfd_set (pkptr, \"hop\", 0);",
		"	op_pk_nfd_set (pkptr, \"flag\", use_backup_path[source_address][destination_address]);",
		"	op_pk_nfd_set (pkptr, \"route_flag\", 0);         //primary path",
		"	op_pk_nfd_set (pkptr, \"restoration_flag\", NORMAL);",
		"	",
		"	",
		"	wave_dist = op_dist_load (\"uniform_int\", 0, WAVE_NUM-1);",
		"	wavelength_number = op_dist_outcome (wave_dist);",

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -