#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 [46];

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



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_PR_ATTR_ASSGN);
	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_STATE);
	obj [8] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [9] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [10] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [11] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [12] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [13] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [14] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [15] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [16] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [17] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [18] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [19] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [20] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [21] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [22] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [23] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [24] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [25] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [26] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [27] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [28] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [29] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [30] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [31] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [32] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [33] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [34] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [35] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [36] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [37] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [38] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [39] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [40] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [41] = Ema_Object_Create (model_id, OBJ_PR_STATE);
	obj [42] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [43] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [44] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [45] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [46] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [47] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [48] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [49] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [50] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [51] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [52] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [53] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [54] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [55] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [56] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [57] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [58] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [59] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [60] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [61] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [62] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [63] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [64] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [65] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [66] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [67] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [68] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [69] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [70] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [71] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [72] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [73] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [74] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [75] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [76] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [77] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [78] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [79] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [80] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [81] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [82] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [83] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [84] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [85] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [86] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [87] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [88] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [89] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [90] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [91] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [92] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [93] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [94] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [95] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [96] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [97] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [98] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [99] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [100] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [101] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [102] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [103] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [104] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [105] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [106] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [107] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [108] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [109] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [110] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [111] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [112] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [113] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [114] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [115] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [116] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [117] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [118] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [119] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [120] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [121] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [122] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [123] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [124] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [125] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [126] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [127] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [128] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [129] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [130] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [131] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [132] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [133] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [134] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [135] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [136] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [137] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [138] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [139] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [140] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [141] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [142] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [143] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [144] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [145] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [146] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [147] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [148] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [149] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [150] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [151] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [152] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [153] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [154] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [155] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [156] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [157] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [158] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [159] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [160] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [161] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [162] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [163] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [164] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [165] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [166] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [167] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [168] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [169] = Ema_Object_Create (model_id, OBJ_PR_TRANS);
	obj [170] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [171] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [172] = Ema_Object_Create (model_id, OBJ_PR_POS);
	obj [173] = Ema_Object_Create (model_id, OBJ_PR_STAT_DESC);




	/* set the model level attributes */
	/* create and init prg list 'prg_lptr [0]' */
	prg_lptr [0] = prg_list_create ();
	prg_list_strings_append (prg_lptr [0], 
		"/* Variable containing needed identifiers */",
		"int			\\net_num0;",
		"int			\\node_num0;",
		"int			\\net_num1;",
		"int			\\node_num1;",
		"int			\\net_num2;",
		"int			\\node_num2;",
		"",
		"/* Packets and ICIs */",
		"Ici*        \\net_ici_ptr;",
		"",
		"/* Routing information */",
		"char				\\route_file[512];",
		"ip_rte_table*		\\rte_table_ptr;",
		"",
		"struct PIMentry* 	\\list;",
		"",
		"/* Stream numbers */",
		"int			\\TO_IP_ENCAP;",
		"int			\\INSTRM_IP_ENCAP;",
		"int			\\TO_IGMP;",
		"int			\\INSTRM_IGMP;",
		"int			\\MAC_LAYER;",
		"",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [1]' */
	prg_lptr [1] = prg_list_create ();
	prg_list_strings_append (prg_lptr [1], 
		"/* Variables whose values are assigned according to the incoming ICI */",
		"Objid		my_id;",
		"Objid		par_id;",
		"Objid		ip_processor_id;",
		"int			group_no;",
		"int			msg_type;",
		"int			src_net;",
		"int			src_node;",
		"int			next_net;",
		"int			next_node;",
		"int			instrm;",
		"int			outstrm;",
		"int			source;",
		"int			mtu;",
		"int			timer;",
		"",
		"/* Counters and flags */",
		"int			i;",
		"int			j;",
		"int			flag;",
		"int			flag2;",
		"int			strm_flag;",
		"int			shared_instrm;",
		"int			shared_outstrm;",
		"",
		"int			temp;",
		"",
		"/* Packet variables */",
		"Packet* 	in_pkptr;",
		"Packet* 	out_pkptr;",
		"Packet* 	data_pkptr;",
		"Ici*		ici_ptr;",
		"",
		"/* PIM variables */",
		"struct PIMentry*	p;",
		"struct PIMentry*	q;",
		"struct PIMentry*	r;",
		"int			RP;",
		"int			WC_bit;",
		"int			RP_bit;",
		"int			oif;",
		"",
		"",
		"/* Prune list variables */",
		"int						prune_list_source;",
		"Prune_list_source_ptr*	prune_list_source_ptr;",
		"List*					prune_list_ptr;",
		"Prune_list_struct*		prune_list_struct_ptr;	",
		"int						prune_list_size;",
		"int						prune_flag;",
		"int topology_type;",
		"",
		"",
		"/* variables for determining stream numbers in INIT */",
		"int			num_streams;",
		"int			num_queues;",
		"Objid		stream_id;",
		"Objid		module_id;",
		"Objid		ip_id;",
		"char		module_type[20];",
		"",
		"",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [2]' */
	prg_lptr [2] = prg_list_create ();
	prg_list_strings_append (prg_lptr [2], 
		"/*******************************************************************************/",
		"/***						The process model								***/",
		"/***							PIM_SM										***/",
		"/***				was developed at Harris Corporation						***/																",
		"/***						Melbourne, Florida								***/",
		"/***					 by Ellen Farrey-Goudeau							***/",
		"/***			with J. Bibb Cain, Tom Billhartz, and Doug Fieg				***/",
		"/***																		***/",
		"/***					This work was supported by							***/ ",
		"/***			the Advanced Research Programs Agency (ARPA)				***/",
		"/***		with funding through Naval Research Laboratory (NRL)			***/",
		"/***					Contract N00014-93-C-2186							***/",
		"/***																		***/",
		"/*******************************************************************************/",
		"",
		"",
		"#include \"igmp.h\"",
		"#include \"pim.h\"",
		"#include \"ip_rte_sup.h\"",
		"",
		"/* This model of Sparse PIM includes a switch. */",
		"/*	If SWITCH = 1, 	all hosts will switch to shortest path trees */",
		"/*					when they receive a data packet from a source. */",
		"/*	If SWITCH = 0,	all hosts will remain on the shared tree. */",
		"extern	int	  PIM_sbt_switch;",
		"",
		"/* Define packet sizes. */",
		"#define		PIM_JOIN_PK_SIZE		320",
		"#define		PIM_PRUNE_PK_SIZE		320",
		"#define		PIM_REG_STOP_PK_SIZE	320",
		"#define		PIM_QUERY_PK_SIZE		320",
		"",
		"",
		"/* Define functions that determine transitions. */",
		"#define		INTRPT_STRM		(op_intrpt_type() == OPC_INTRPT_STRM)",
		"#define 	INTRPT_SELF		(op_intrpt_type() == OPC_INTRPT_SELF)",
		"",
		"#define		FROM_IGMP		(INTRPT_STRM && (op_intrpt_strm() == INSTRM_IGMP))",
		"#define		FROM_NETWORK	(INTRPT_STRM && (op_intrpt_strm() == INSTRM_IP_ENCAP))",
		"",
		"#define		IGMP_JOIN			(msg_type == CBT_JOIN)",
		"#define		IGMP_LEAVE			(msg_type == CBT_LEAVE)",
		"",
		"",
		"#define		NEW_GROUP		(msg_type == MULTICAST_MSG && src_net == net_num0)",
		"#define		SPT_SETUP		(msg_type == MULTICAST_MSG && src_net != net_num0)",
		"#define		JOIN_SOURCE		(msg_type == PIM_JOIN && WC_bit == 0)",
		"#define		JOIN_SHARED		(msg_type == PIM_JOIN && WC_bit == 1)",
		"#define		PRUNE			(msg_type == PIM_PRUNE && WC_bit == RP_bit)",
		"#define		PRUNE_RPENTRY	(msg_type == PIM_PRUNE && WC_bit != RP_bit)",
		"#define		REGISTER		(msg_type == PIM_REGISTER)",
		"#define		REGISTER_STOP	(msg_type == PIM_REGISTER_STOP)",
		"#define		RP_REPORT		(msg_type == IGMP_RP_REPORT)",
		"#define		TIMEOUT			(INTRPT_SELF && op_intrpt_code() == 0)",
		"#define		SEND_PIM_QUERY	(INTRPT_SELF && op_intrpt_code() == 1)",
		"#define		RCV_PIM_QUERY	(msg_type == PIM_QUERY)",
		"",
		"#define 	TIMEOUT_LENGTH		200   /* Currently set large enough to never timeout. */",
		"#define		QUERY_INTERVAL		30",
		"",
		"",
		"typedef struct",
		"	{",
		"	List*		prune_list_ptr;",
		"	}	Prune_list_struct;",
		"",
		"typedef struct",
		"	{",
		"	int		source;",
		"	}	Prune_list_source_ptr;",
		"",
		"int RPLocations_set = 0;",
		PRGC_NIL);

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

	/* create and init prg list 'prg_lptr [4]' */
	prg_lptr [4] = prg_list_create ();
	/* create and init prg list 'prg_lptr [5]' */
	prg_lptr [5] = prg_list_create ();
	/* create and init prg list 'prg_lptr [6]' */
	prg_lptr [6] = prg_list_create ();
	/* create and init prg list 'prg_lptr [7]' */
	prg_lptr [7] = prg_list_create ();
	/* create and init prg list 'prg_lptr [8]' */
	prg_lptr [8] = prg_list_create ();
	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_INTENDED, EMAC_DISABLED,
		"local stat descs",     COMP_ARRAY_CONTENTS (0), obj [173],
		"child processes",      COMP_CONTENTS, prg_lptr [6],
		"model comments",       COMP_CONTENTS, prg_lptr [7],
		"ext fileset",          COMP_CONTENTS, prg_lptr [8],
		"interface descriptions",COMP_INTENDED, EMAC_DISABLED,
		"attribute assignments",COMP_ARRAY_CONTENTS (0), obj [0],
		"attribute assignments",COMP_ARRAY_CONTENTS (1), obj [1],
		"attribute assignments",COMP_ARRAY_CONTENTS (2), obj [2],
		"attribute assignments",COMP_ARRAY_CONTENTS (3), obj [3],
		EMAC_EOL);

	Ema_Model_Attr_Set (model_id,
		"attribute assignments",COMP_ARRAY_CONTENTS (4), obj [4],
		"attribute assignments",COMP_ARRAY_CONTENTS (5), obj [5],
		"attribute assignments",COMP_ARRAY_CONTENTS (6), obj [6],
		"simulation attributes",COMP_INTENDED, EMAC_DISABLED,
		EMAC_EOL);



	/* assign attrs for object 'obj [7]' */
	/* create and init prg list 'prg_lptr [9]' */
	prg_lptr [9] = prg_list_create ();
	prg_list_strings_append (prg_lptr [9], 
		"/**********************************************************************************************/",
		"/***						Enter executives for the state									***/",
		"/***                        			INIT												***/",
		"/***	An interrupt to reach this state is triggered at the start of the simulation		***/",
		"/***				by a \"beginsim\" interrupt setting in the \"pim\" module.					***/",
		"/***					Several initialization steps are performed.							***/ ",
		"/**********************************************************************************************/",
		"",
		"/****************************************************************/",
		"/* Obtain the object ID of the surrounding PIM processor. 		*/",
		"/* Also obtain the attributes of this module.					*/",
		"/****************************************************************/",
		"my_id = op_id_self ();",
		"par_id = op25_topo_parent(my_id);",
		"ip_processor_id = op_id_from_name (par_id, OPC_OBJTYPE_QUEUE,\"ip\");",
		"",
		"op_ima_sim_attr_get(OPC_IMA_INTEGER, \"PIM_sbt\", &PIM_sbt_switch);",
		"",
		"op_ima_obj_attr_get(par_id, \"ip.net_num0\", &net_num0);",
		"op_ima_obj_attr_get(par_id, \"ip.node_num0\", &node_num0);",
		"op_ima_obj_attr_get(ip_processor_id, \"net_num1\", &net_num1);",
		"op_ima_obj_attr_get(ip_processor_id, \"node_num1\", &node_num1);",
		"op_ima_obj_attr_get(ip_processor_id, \"net_num2\", &net_num2);",
		"op_ima_obj_attr_get(ip_processor_id, \"node_num2\", &node_num2);",
		"op_ima_sim_attr_get(OPC_IMA_INTEGER, \"topology_type\", &topology_type);",
		"",
		"/****************************************************************/",
		"/* Obtain the name of the routing file 							*/",
		"/*	to be used by this IP processor. 							*/",
		"/* Load and parse the file to obtain a routing table. 			*/",
		"/****************************************************************/",
		"op_ima_obj_attr_get (par_id, \"ip.route_file\", route_file);",
		"",
		"rte_table_ptr = ip_rte_sup_table_setup (route_file, net_num0, node_num0,",
		"			net_num1, node_num1, net_num2, node_num2);",
		"",
		"TO_IP_ENCAP = get_stream(my_id, \"to\", \"ip_encap\");",
		"INSTRM_IP_ENCAP = get_stream(my_id, \"instrm\", \"ip_encap\");",
		"TO_IGMP = get_stream(my_id, \"to\", \"igmp\");",
		"INSTRM_IGMP = get_stream(my_id, \"instrm\", \"igmp\");",
		"INSTRM_IP_ENCAP = get_stream(my_id, \"instrm\", \"ip_encap\");",
		"INSTRM_IGMP = get_stream(my_id, \"instrm\", \"igmp\");",
		"",
		"/*printf(\"\\n(%3d,%d) PIM_SM:  INSTRM_IP_ENCAP = %d, INSTRM_IGMP = %d\", ",
		"	net_num0,node_num0,INSTRM_IP_ENCAP,INSTRM_IGMP); */",
		"",
		"",
		"",
		"/****************************************************************/",
		"/* Create the ICI that will be sent with outgoing packets. 		*/",
		"/****************************************************************/",
		"net_ici_ptr = op_ici_create(\"ip_encap_req\");",
		"",
		"/****************************************************************/",
		"/* Begin constructing the linked list 							*/",
		"/*	that contains the PIM entries. 								*/",
		"/****************************************************************/",
		"list = NULL;",
		"PIMPointerLoc[net_num0][node_num0] = list;",
		"PIMWCListPointerLoc[net_num0][node_num0] = list;",
		"",
		"/****************************************************************/",
		"/* Set timer to check PIM entries. 								*/  ",
		"/*	If an entry has not been used in TIMEOUT_LENGTH seconds, 	*/",
		"/*	it should be removed. 										*/",
		"/*	The first timer will be set randomly 						*/",
		"/*	to a time between TIMEOUT_LENGTH and 2*TIMEOUT_LENGTH. 		*/",
		"/****************************************************************/",
		"op_intrpt_schedule_self( (1+op_dist_uniform(1))*TIMEOUT_LENGTH, 0);",
		"",
		"/****************************************************************/",
		"/* Set a timer to schedule sending of the first PIM_QUERY. 		*/",
		"/****************************************************************/",
		"op_intrpt_schedule_self(op_dist_uniform(1)*QUERY_INTERVAL, 1);",
		"",
		"/****************************************************************/",
		"/* This code initializes the Rendevous Points for each group.  	*/",
		"/* It only needs to be performed once, 							*/",
		"/* but is currently performed in every router with a PIM process*/",
		"/****************************************************************/",
		"if (!RPLocations_set)",
		"   {",
		"   RPLocations_set = 1;",
		"",
		"   if(topology_type == 0)",
		"#include \"RPLocations_aai.h\"",
		"",
		"   else if(topology_type == 1)",
		"#include \"RPLocations_mesh.h\"",
		"",
		"   else ",
		"	  {",
		"	  printf(\"\\nRP LOCATIONS HAVE NOT BEEN SET.\");",
		"	  printf(\"\\nPLEASE END THIS SIMULATION AND SEE THE INIT STATE OF THE PIM SPARSE PROCESS MODEL.\");",
		"      }",
		"   }",
		"",
		"/********************************************************/",
		"/* Learn the stream leading from IP to the network. 	*/",
		"/********************************************************/",
		PRGC_NIL);

	prg_list_strings_append (prg_lptr [9], 
		"MAC_LAYER = -1;",
		"num_queues = op25_topo_child_count(par_id,OPC_OBJTYPE_QUEUE);",
		"if (num_queues > 0)",
		"  	{	",
		"  	for (i=0;i<num_queues;i++)",
		"		{",
		"		module_id = op25_topo_child(par_id,OPC_OBJTYPE_QUEUE,i);",
		"		op_ima_obj_attr_get(module_id,\"name\",module_type); ",
		"	  	if (strcmp(module_type,\"ip\") == 0)",
		"			ip_id = module_id;",
		"		}",
		"	num_streams = op_topo_assoc_count(ip_id,OPC_TOPO_ASSOC_OUT, OPC_OBJTYPE_STRM);",
		"	for (i=0;i<num_streams;i++)",
		"		{ ",
		"		stream_id = op_topo_assoc (ip_id, OPC_TOPO_ASSOC_OUT, OPC_OBJTYPE_STRM, i);",
		"		module_id = op_topo_assoc (stream_id, OPC_TOPO_ASSOC_OUT, OPC_OBJMTYPE_MODULE, 0);",
		"		op_ima_obj_attr_get(module_id,\"name\",module_type); ",
		"		if (strcmp(module_type,\"arp\") == 0)",
		"		op_ima_obj_attr_get(stream_id, \"src stream\", &MAC_LAYER);",
		"    	}",
		"	}",
		"if(op_prg_odb_ltrace_active(\"test_code\")) ",
		" printf(\"\\n(%3d, %d) PIM_DM: MAC_LAYER = %d\",",
		"	net_num0,node_num0,MAC_LAYER);",
		"",
		"",
		"",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [10]' */
	prg_lptr [10] = prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [7], 
		"name",                 COMP_CONTENTS, "init",
		"enter execs",          COMP_CONTENTS, prg_lptr [9],
		"exit execs",           COMP_CONTENTS, prg_lptr [10],
		"status",               COMP_TOGGLE,   EMAC_ENABLED,
		"position",             COMP_CONTENTS, obj [8],
		"initial",              COMP_TOGGLE,   EMAC_ENABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [9]' */
	/* create and init prg list 'prg_lptr [11]' */
	prg_lptr [11] = prg_list_create ();
	/* create and init prg list 'prg_lptr [12]' */
	prg_lptr [12] = prg_list_create ();
	prg_list_strings_append (prg_lptr [12], 
		"",
		" ",
		PRGC_NIL);

	Ema_Object_Attr_Set (model_id, obj [9], 
		"name",                 COMP_CONTENTS, "idle",
		"enter execs",          COMP_CONTENTS, prg_lptr [11],
		"exit execs",           COMP_CONTENTS, prg_lptr [12],
		"status",               COMP_TOGGLE,   EMAC_DISABLED,
		"position",             COMP_CONTENTS, obj [10],
		"initial",              COMP_TOGGLE,   EMAC_DISABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [11]' */
	/* create and init prg list 'prg_lptr [13]' */
	prg_lptr [13] = prg_list_create ();
	prg_list_strings_append (prg_lptr [13], 
		"/***********************************************************************************************/",
		"/***						Enter executives for the state									***/",
		"/***                        		FROM_NETWORK											***/",
		"/***	This state processes all packets that arrive at the PIM module from IP_ENCAP.		***/",
		"/***	The data in the packet and ICI are gathered and assigned to local variables.		***/ ",
		"/***********************************************************************************************/",
		"",
		"",
		"in_pkptr = op_pk_get(op_intrpt_strm());",
		"ici_ptr = op_intrpt_ici();",
		"op_ici_attr_get(ici_ptr, \"dest_net\", &msg_type);",
		"op_ici_attr_get(ici_ptr, \"dest_node\", &group_no);",
		"op_ici_attr_get(ici_ptr, \"src_net\", &src_net);",
		"op_ici_attr_get(ici_ptr, \"src_node\", &src_node);",
		"op_ici_attr_get(ici_ptr, \"instrm\", &instrm);",
		"op_ici_attr_get(ici_ptr, \"source\", &source);",
		"op_ici_attr_get(ici_ptr, \"RP_bit\", &RP_bit);",
		"op_ici_attr_get(ici_ptr, \"WC_bit\", &WC_bit);",
		"",
		"",
		"",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [14]' */
	prg_lptr [14] = prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [11], 
		"name",                 COMP_CONTENTS, "FROM_NETWORK",
		"enter execs",          COMP_CONTENTS, prg_lptr [13],
		"exit execs",           COMP_CONTENTS, prg_lptr [14],
		"status",               COMP_TOGGLE,   EMAC_ENABLED,
		"position",             COMP_CONTENTS, obj [12],
		"initial",              COMP_TOGGLE,   EMAC_DISABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [13]' */
	/* create and init prg list 'prg_lptr [15]' */
	prg_lptr [15] = prg_list_create ();
	prg_list_strings_append (prg_lptr [15], 
		"/**********************************************************************************************/",
		"/***                            Enter executives for the state 								***/",
		"/***                                  JOIN_SOURCE_TREE										***/",
		"/***  		Find the appropriate (S,G) entry and update its output interface list			***/",
		"/***			to include the instream on which the PIM_JOIN request arrived.				***/",
		"/**********************************************************************************************/",
		"",
		"",
		"if( op_prg_odb_ltrace_active(\"pim_sm\") || op_prg_odb_ltrace_active(\"nrl_all\") ",
		"		|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"	printf(\"\\n%6.3f (%3d, %d) PIM_SM: JOIN source_based tree for group %d.\",",
		"			op_sim_time(),net_num0,node_num0,group_no);",
		"",
		"",
		"/*********************************************************/",
		"/* First, search for (S, G) entries at this router.		*/",
		"/* If an entry exists, update the output interface list */",
		"/* 	to include the instream. 							*/",
		"/*********************************************************/",
		"",
		"",
		"p = PIMPointerLoc[net_num0][node_num0];",
		"flag = 0;",
		"while (p && !flag)",
		"	{",
		"	if ((p->Source == source) && (p->Group == group_no))",
		"		{              ",
		"		flag = 1;",
		"		p->last_use = op_sim_time();",
		"		if ( (p->oif & (int)pow(2.0,(float)instrm)) == 0)",
		"			p->oif = p->oif | (int)pow(2.0,(float)instrm);",
		"			if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"					|| op_prg_odb_ltrace_active(\"nrl_all\")",
		"					|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"					printf(\"\\n%6.3f (%3d, %d) PIM_SM: Updating oif of (%d, %d) entry.\",",
		"						op_sim_time(),net_num0,node_num0,source,group_no);",
		"",
		"		/***********************************/",
		"		/* Additional processing is needed */",
		"		/*	when RP_bit = 1.			   */",
		"		/***********************************/",
		"",
		"		if (p->RP_bit == 1)",
		"			{",
		"			/*****************************************/",
		"			/* Update (S,G,RP) entry to (S,G) entry. */",
		"			/*****************************************/",
		"			p->RP_bit = 0;",
		"			ip_rte_sup_route_select(rte_table_ptr, p->Source, 0, &next_net, &next_node, &outstrm, &mtu);",
		"			p->iif = outstrm;",
		"",
		"			out_pkptr = op_pk_create(PIM_JOIN_PK_SIZE);",
		"			op_ici_attr_set(net_ici_ptr, \"dest_net\", PIM_JOIN);",
		"			op_ici_attr_set(net_ici_ptr, \"dest_node\", group_no);",
		"			op_ici_attr_set(net_ici_ptr, \"src_net\", net_num0);",
		"			op_ici_attr_set(net_ici_ptr, \"src_node\", node_num0);",
		"			op_ici_attr_set(net_ici_ptr, \"source\",p->Source);",
		"			op_ici_attr_set(net_ici_ptr, \"RP_bit\", 0);",
		"			op_ici_attr_set(net_ici_ptr, \"WC_bit\", 0);",
		"			op_ici_install(net_ici_ptr);",
		"			if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"					|| op_prg_odb_ltrace_active(\"nrl_all\")",
		"					|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"					printf(\"\\n%6.3f (%3d, %d) PIM_SM: Sending PIM_JOIN for the (%d, %d). iif = %d.  RP_bit = %d.\",",
		"						op_sim_time(),net_num0,node_num0,source,group_no,p->iif,p->RP_bit);",
		"			op_pk_send_forced(out_pkptr,TO_IP_ENCAP);",
		"",
		"			/****************************************/",
		"			/* Forward a (S,G,RP) PIM_PRUNE request	*/",
		"			/*	towards the RP						*/",
		"			/*	to tear down the (S,G) tree.		*/",
		"			/****************************************/",
		"			out_pkptr = op_pk_create(PIM_PRUNE_PK_SIZE);",
		"			op_ici_attr_set(net_ici_ptr, \"dest_net\", PIM_PRUNE);",
		"			op_ici_attr_set(net_ici_ptr, \"dest_node\", group_no);",
		"			op_ici_attr_set(net_ici_ptr, \"src_net\", net_num0);",
		"			op_ici_attr_set(net_ici_ptr, \"src_node\", node_num0);",
		"			op_ici_attr_set(net_ici_ptr, \"source\",p->Source);",
		"			op_ici_attr_set(net_ici_ptr, \"RP_bit\", 1);",
		"			op_ici_attr_set(net_ici_ptr, \"WC_bit\", 0);",
		"			op_ici_install(net_ici_ptr);",
		"			if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"					|| op_prg_odb_ltrace_active(\"nrl_all\")",
		"					|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"					printf(\"\\n%6.3f (%3d, %d) PIM_SM: Sending PIM_PRUNE for the (%d, %d,RP_bit).\",",
		"						op_sim_time(),net_num0,node_num0,source,group_no,p->iif);",
		"			op_pk_send_forced(out_pkptr,TO_IP_ENCAP);",
		"			}",
		"		}",
		"	p=p->next;",
		"	}",
		"",
		"/********************************************************/",
		"/*	If no (S,G) entry exists, create an (S, G) entry 	*/  ",
		"/*	and forward a PIM_JOIN packet towards the source.	*/",
		"/********************************************************/",
		"if (flag == 0)",
		"	{",
		"	if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"		|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		PRGC_NIL);

	prg_list_strings_append (prg_lptr [15], 
		"		|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"		printf(\"\\n%6.3f (%3d, %d) PIM_SM: A PIM entry for (%d, %d) was added.\",",
		"				op_sim_time(),net_num0,node_num0,source,group_no);",
		"",
		"	/****************************/",
		"	/* Create an (S,G) entry. 	*/",
		"	/****************************/",
		"	p = (struct PIMentry*) op_prg_mem_alloc(sizeof(struct PIMentry));",
		"	p->Group = group_no;",
		"	p->Source = source;",
		"	ip_rte_sup_route_select(rte_table_ptr, source, 0, &next_net, &next_node, &outstrm, &mtu);",
		"	p->iif = outstrm; ",
		"	p->RP_bit = 0;",
		"	p->WC_bit = WC_bit;",
		"	p->SPT = 0;",
		"	p->last_use = op_sim_time();",
		"	p->next = PIMPointerLoc[net_num0][node_num0];",
		"	PIMPointerLoc[net_num0][node_num0] = p;",
		"	",
		"	/* To set the oif field of the new entry, determine the oif of the (*,G) entry. */",
		"	q = PIMWCListPointerLoc[net_num0][node_num0];",
		"	flag2 = 0;",
		"	while (q && !flag2)",
		"		{",
		"		if (q->Group == group_no)",
		"			{",
		"			flag2 = 1;",
		"			shared_instrm = q->iif;",
		"			shared_outstrm = q->oif;",
		"			}",
		"		q=q->next;",
		"		}",
		"",
		"	/********************************************************************/",
		"	/* If a (*,G) entry exists, copy the oif to the new entry. 			*/",
		"	/* If no (*,G) entry exists, assign the instrm value to the oif. 	*/",
		"	/********************************************************************/",
		"	if (flag2)",
		"		{",
		"		p->oif = shared_outstrm | (int)pow(2.0,(float)instrm);",
		"		if ( p->oif & (int)pow(2.0,(float)outstrm) )",
		"			p->oif = p->oif ^ (int)pow(2.0,(float)outstrm);",
		"		}",
		"   	else",
		"		p->oif = (int)pow(2.0,(float)instrm);",
		"",
		"",
		"	/****************************************/",
		"	/* If this is not the destination, 		*/",
		"	/* 	send a packet towards the source. 	*/",
		"	/****************************************/",
		"	if (net_num0 != source) ",
		"		{",
		"		out_pkptr = op_pk_create(PIM_JOIN_PK_SIZE);",
		"		op_ici_attr_set(net_ici_ptr, \"dest_net\", PIM_JOIN);",
		"		op_ici_attr_set(net_ici_ptr, \"dest_node\", group_no);",
		"		op_ici_attr_set(net_ici_ptr, \"src_net\", net_num0);",
		"		op_ici_attr_set(net_ici_ptr, \"src_node\", node_num0);",
		"		op_ici_attr_set(net_ici_ptr, \"source\",source);",
		"		op_ici_attr_set(net_ici_ptr, \"RP_bit\", RP_bit);",
		"		op_ici_attr_set(net_ici_ptr, \"WC_bit\", WC_bit);",
		"		op_ici_install(net_ici_ptr);",
		"		op_pk_send_forced(out_pkptr,TO_IP_ENCAP);",
		"		if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"			|| op_prg_odb_ltrace_active(\"nrl_all\")",
		"			|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"			printf(\"\\n%6.3f (%3d, %d) PIM_SM: A PIM_JOIN entry for the (%d, %d) tree was added.\",",
		"				op_sim_time(),net_num0,node_num0,source,group_no);",
		"		}",
		"",
		"	/************************************************************/",
		"	/* If the instrm of the new (S,G) entry 					*/",
		"	/*   does not equal the instrm of the (*,G) entry, 			*/",
		"	/*   forward a PIM_PRUNE message with WC_bit=0 				*/",
		"	/*   towards the RP to ask to prune from the shared tree. 	*/",
		"	/************************************************************/",
		"	if (flag2 && shared_instrm != p->iif)",
		"		{",
		"		if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"			|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"			|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"			printf(\"\\n%6.3f (%3d, %d) PIM_SM: PIM_PRUNE sent to remove path from (*, %d) tree.\",",
		"				op_sim_time(),net_num0,node_num0,group_no);",
		"",
		"		out_pkptr = op_pk_create(PIM_PRUNE_PK_SIZE);",
		"		op_ici_attr_set(net_ici_ptr,\"dest_net\",PIM_PRUNE);",
		"		op_ici_attr_set(net_ici_ptr,\"dest_node\",group_no);",
		"		op_ici_attr_set(net_ici_ptr,\"source\",source);",
		"		op_ici_attr_set(net_ici_ptr,\"src_net\",net_num0);",
		"		op_ici_attr_set(net_ici_ptr,\"src_node\",node_num0);",
		"		op_ici_attr_set(net_ici_ptr,\"RP_bit\",1);",
		"		op_ici_attr_set(net_ici_ptr,\"WC_bit\",0);",
		"		op_ici_install(net_ici_ptr);                   ",
		"		op_pk_send_forced(out_pkptr,TO_IP_ENCAP);",
		"		}  	",
		"    }",
		"",
		"op_pk_destroy(in_pkptr);",
		"",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [16]' */
	prg_lptr [16] = prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [13], 
		"name",                 COMP_CONTENTS, "JOIN_SOURCE_TREE",
		"enter execs",          COMP_CONTENTS, prg_lptr [15],
		"exit execs",           COMP_CONTENTS, prg_lptr [16],
		"status",               COMP_TOGGLE,   EMAC_ENABLED,
		"position",             COMP_CONTENTS, obj [14],
		"initial",              COMP_TOGGLE,   EMAC_DISABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [15]' */
	/* create and init prg list 'prg_lptr [17]' */
	prg_lptr [17] = prg_list_create ();
	prg_list_strings_append (prg_lptr [17], 
		"/**********************************************************************************************/",
		"/***						Enter executives for the state									***/",
		"/***                        		IGMP_JOIN												***/",
		"/***	This state processes Join Requests that arrive from this router's IGMP modeule.		***/",
		"/***				If a (*,G) entry exists for the group reported,							***/ ",
		"/***					the output interface list is updated.								***/",
		"/*** If no (*,G) entry exists, one is created & a (*,G) PIM_JOIN request is sent to the RP.	***/",
		"/**********************************************************************************************/",
		"",
		"if( op_prg_odb_ltrace_active(\"pim_sm\") || op_prg_odb_ltrace_active(\"nrl_all\") ",
		"		|| (op_prg_odb_ltrace_active(\"one_group\") && GROUP_TO_TRACE == group_no))",
		"	printf(\"\\n%6.3f (%3d, %d) PIM_SM: Entering state IGMP_JOIN.\",",
		"		op_sim_time(),net_num0,node_num0);",
		"",
		"/****************************************/",
		"/* Determine if a (*, G) entry exists.	*/",
		"/*	If an entry exists, 				*/",
		"/*	update the output interface list.	*/",
		"/****************************************/",
		"",
		"p = PIMWCListPointerLoc[net_num0][node_num0];",
		"flag = 0;",
		"while (p)",
		"	{",
		"	if (p->Group == group_no)",
		"		{",
		"		if (p->oif & (int)pow(2.0,(float)MAC_LAYER) )",
		"			p->oif = p->oif | (int)pow(2.0,(float)MAC_LAYER);",
		"		p->last_use = op_sim_time();",
		"		flag = 1;",
		"		}",
		"	p=p->next;",
		"	 }",
		"",
		"if (op_prg_odb_ltrace_active(\"one_group\") && GROUP_TO_TRACE == group_no)",
		"	if (flag)",
		"		printf(\"\\n A (*, %d) entry exists.\",group_no);",
		"	else",
		"		printf(\"\\n NO (*, %d) entry exists.\",group_no);",
		"",
		"/****************************************************/",
		"/*If no (*, G) PIM entry exists, create one. 		*/",
		"/****************************************************/",
		"",
		"if (!flag)",
		"	{",
		"	/*******************************************************/",
		"	/* Get the address of the Rendevous Point for group G. */",
		"	/*******************************************************/",
		"	RP=RPTable[group_no][0];",
		"	ip_rte_sup_route_select(rte_table_ptr, RP, RPTable[group_no][1], &next_net, &next_node, &outstrm, &mtu);",
		"",
		"	/**************************************/",
		"	/* Create an (*,G) entry for group G. */",
		"	/**************************************/",
		"	p = (struct PIMentry*) op_prg_mem_alloc(sizeof(struct PIMentry));",
		"	p->Group = group_no;",
		"	p->Source = RP;",
		"	p->iif = outstrm;",
		"	p->oif = (int)pow(2.0,(float)MAC_LAYER);",
		"	p->RP_bit = 1;",
		"	p->SPT = 0;",
		"	p->last_use = op_sim_time();",
		"	p->next = PIMWCListPointerLoc[net_num0][node_num0];",
		"	PIMWCListPointerLoc[net_num0][node_num0] = p;",
		"",
		"	if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"		|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"		|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"			printf(\"\\n%6.3f (%3d, %d) PIM_SM: A PIM entry for (*,%d) was added.\",",
		"				op_sim_time(),net_num0,node_num0,p->Group);",
		"",
		"	/******************************************/",
		"	/* Send a PIM_JOIN packet towards the RP. */",
		"	/******************************************/",
		"	if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"		|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"		|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"   	  		printf(\"\\n%6.3f (%3d, %d) PIM_SM: PIM_JOIN message generated for group %d. ( RP = (%d, %d) )\",",
		"				op_sim_time(),net_num0,node_num0,group_no,RP,RPTable[group_no][1]);",
		"",
		"	out_pkptr = op_pk_create_fmt(\"pim_join_pk_format\");",
		"	op_pk_bulk_size_set(out_pkptr,PIM_JOIN_PK_SIZE);",
		"",
		"	prune_list_ptr = op_prg_list_create();",
		"	prune_list_struct_ptr = (Prune_list_struct*)op_prg_mem_alloc(sizeof(Prune_list_struct));",
		"	prune_list_struct_ptr->prune_list_ptr = prune_list_ptr;",
		"",
		"	op25_pk_nfd_set(out_pkptr,\"prune_list_ptr\",prune_list_struct_ptr,op_prg_mem_alloc,op_prg_mem_free,sizeof(Prune_list_struct));",
		"",
		"	op_ici_attr_set(net_ici_ptr, \"dest_net\", PIM_JOIN);",
		"	op_ici_attr_set(net_ici_ptr, \"dest_node\", group_no);",
		"	op_ici_attr_set(net_ici_ptr, \"src_net\", net_num0);",
		"	op_ici_attr_set(net_ici_ptr, \"src_node\", node_num0);",
		"	op_ici_attr_set(net_ici_ptr, \"source\", RP);",
		"	op_ici_attr_set(net_ici_ptr, \"RP_bit\", 1);",
		"	op_ici_attr_set(net_ici_ptr, \"WC_bit\", 1);",
		"	op_ici_install(net_ici_ptr);",
		"	op_pk_send(out_pkptr,TO_IP_ENCAP);",
		"	} ",
		PRGC_NIL);

	prg_list_strings_append (prg_lptr [17], 
		"",
		"op_pk_destroy(in_pkptr);",
		"",
		"",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [18]' */
	prg_lptr [18] = prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [15], 
		"name",                 COMP_CONTENTS, "IGMP_JOIN",
		"enter execs",          COMP_CONTENTS, prg_lptr [17],
		"exit execs",           COMP_CONTENTS, prg_lptr [18],
		"status",               COMP_TOGGLE,   EMAC_ENABLED,
		"position",             COMP_CONTENTS, obj [16],
		"initial",              COMP_TOGGLE,   EMAC_DISABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [17]' */
	/* create and init prg list 'prg_lptr [19]' */
	prg_lptr [19] = prg_list_create ();
	prg_list_strings_append (prg_lptr [19], 
		"/**********************************************************************************************/",
		"/***							Enter executives for the state								***/",
		"/***                               		IGMP_LEAVE											***/",
		"/***	This state processes Leave Requests that arrive from this router's IGMP module.		***/",
		"/***		The output interface leading to the MAC is deleted from the (*,G) entry.		***/",
		"/***					If the remaining output interface list is null,						***/ ",
		"/***				the entry is removed and a PIM_PRUNE message is sent.					***/",
		"/***				The MAC interface is also removed from all (S,G) entries				***/ ",
		"/***	and (S,G) PIM_PRUNE messages are sent for those with null output interface lists.	***/",
		"/**********************************************************************************************/",
		"",
		"",
		"if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"		|| op_prg_odb_ltrace_active(\"nrl_all\")",
		"		|| op_prg_odb_ltrace_active(\"prune\") ",
		"		|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"	printf(\"\\n%6.3f (%3d, %d) PIM_SM: Entering state IGMP_LEAVE.\", ",
		"			op_sim_time(),net_num0, node_num0);",
		"",
		"strm_flag = 0;",
		"",
		"p=PIMWCListPointerLoc[net_num0][node_num0];",
		"q = list;",
		"while (p)",
		"	{",
		"	if (p->Group == group_no)",
		"		{",
		"		if (p->oif & (int)pow(2.0,(float)MAC_LAYER))",
		"	 		p->oif = p->oif ^ (int)pow(2.0,(float)MAC_LAYER);",
		"		if (p->oif == 0)",
		"			{",
		"			/****************************************************/",
		"			/* If the output interface list is empty,			*/",
		"			/* 	send a PIM_PRUNE message towards the source.	*/",
		"			/****************************************************/",
		"			out_pkptr = op_pk_create(PIM_PRUNE_PK_SIZE);",
		"			op_ici_attr_set(net_ici_ptr, \"dest_net\", PIM_PRUNE);",
		"			op_ici_attr_set(net_ici_ptr, \"dest_node\", group_no);",
		"			op_ici_attr_set(net_ici_ptr, \"source\",p->Source);",
		"			op_ici_attr_set(net_ici_ptr, \"src_net\", net_num0);",
		"			op_ici_attr_set(net_ici_ptr, \"src_node\", node_num0);",
		"			op_ici_attr_set(net_ici_ptr, \"RP_bit\", 1);",
		"			op_ici_attr_set(net_ici_ptr, \"WC_bit\", 1);",
		"			op_ici_install(net_ici_ptr);",
		"			op_pk_send_forced(out_pkptr,TO_IP_ENCAP);",
		"",
		"			/*********************/",
		"			/* Remove PIM entry. */",
		"			/*********************/",
		"			if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"					|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"					|| op_prg_odb_ltrace_active(\"prune\")",
		"					|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"						printf(\"\\n%6.3f (%3d, %d) PIM_SM: Removing the (*, %d) entry and forwarding PRUNE.\",",
		"								op_sim_time(),net_num0,node_num0,group_no);",
		"			if (q)",
		"				{",
		"				q->next = p->next;",
		"				op_prg_mem_free(p);",
		"				p=q->next;",
		"				}",
		"			else",
		"				{",
		"				PIMWCListPointerLoc[net_num0][node_num0] = p->next;",
		"				op_prg_mem_free(p);",
		"				p = PIMWCListPointerLoc[net_num0][node_num0];",
		"				}",
		"",
		"			strm_flag = 1;",
		"			}",
		"		else",
		"			{",
		"			q = p;",
		"			p = p->next;",
		"			}",
		"		}",
		"	else",
		"		{",
		"		q = p;",
		"		p = p->next;",
		"		}",
		"	}",
		"",
		"/*****************************************/",
		"/* Repeat these steps for (S,G) entries. */",
		"/*****************************************/",
		"p=PIMPointerLoc[net_num0][node_num0];",
		"q = list;",
		"while (p)",
		"	{",
		"	flag = 1;",
		"	if (p->Group == group_no && p->Source != net_num0)",
		"		{",
		"		temp = p->oif;",
		"		if (p->oif & (int)pow(2.0,(float)MAC_LAYER))",
		"			{",
		"	 		p->oif = p->oif ^ (int)pow(2.0,(float)MAC_LAYER);",
		"			if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"					|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"					|| op_prg_odb_ltrace_active(\"prune\")",
		PRGC_NIL);

	prg_list_strings_append (prg_lptr [19], 
		"					|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"						printf(\"\\n%6.3f (%3d, %d) PIM_SM: Output interface of (%d, %d) entry updated from %d to %d.\",",
		"								op_sim_time(),net_num0,node_num0,p->Source,group_no,temp,p->oif);",
		"            }",
		"		if (p->oif == 0)",
		"			{",
		"			out_pkptr = op_pk_create(PIM_PRUNE_PK_SIZE);",
		"			op_ici_attr_set(net_ici_ptr, \"dest_net\", PIM_PRUNE);",
		"			op_ici_attr_set(net_ici_ptr, \"dest_node\", group_no);",
		"			op_ici_attr_set(net_ici_ptr, \"source\",p->Source);",
		"			op_ici_attr_set(net_ici_ptr, \"src_net\", net_num0);",
		"			op_ici_attr_set(net_ici_ptr, \"src_node\", node_num0);",
		"			op_ici_attr_set(net_ici_ptr, \"RP_bit\", 0);",
		"			op_ici_attr_set(net_ici_ptr, \"WC_bit\", 0);",
		"			op_ici_install(net_ici_ptr);",
		"			op_pk_send_forced(out_pkptr,TO_IP_ENCAP);",
		"",
		"			/*********************/",
		"			/* Remove PIM entry. */",
		"			/*********************/",
		"			if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"					|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"					|| op_prg_odb_ltrace_active(\"prune\")",
		"					|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"						printf(\"\\n%6.3f (%3d, %d) PIM_SM: Removing the (%d, %d) entry.\",",
		"								op_sim_time(),net_num0,node_num0,p->Source,group_no);",
		"			if (q)",
		"				{",
		"				q->next = p->next;",
		"				op_prg_mem_free(p);",
		"				p=q->next;",
		"				}",
		"			else",
		"				{",
		"				PIMPointerLoc[net_num0][node_num0] = p->next;",
		"				op_prg_mem_free(p);",
		"				p = PIMPointerLoc[net_num0][node_num0];",
		"				}",
		"			",
		"			strm_flag = 1;",
		"			}",
		"		else",
		"			{",
		"			q = p;",
		"			p=p->next;",
		"			}",
		"		}",
		"	else",
		"		{",
		"		q = p;",
		"		p=p->next;",
		"		}",
		"	}",
		"	",
		"op_pk_destroy(in_pkptr);",
		"",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [20]' */
	prg_lptr [20] = prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [17], 
		"name",                 COMP_CONTENTS, "IGMP_LEAVE",
		"enter execs",          COMP_CONTENTS, prg_lptr [19],
		"exit execs",           COMP_CONTENTS, prg_lptr [20],
		"status",               COMP_TOGGLE,   EMAC_ENABLED,
		"position",             COMP_CONTENTS, obj [18],
		"initial",              COMP_TOGGLE,   EMAC_DISABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [19]' */
	/* create and init prg list 'prg_lptr [21]' */
	prg_lptr [21] = prg_list_create ();
	prg_list_strings_append (prg_lptr [21], 
		"/***********************************************************************************************/",
		"/***						Enter executives for the state									***/",
		"/***                        		FROM_IGMP												***/",
		"/***	This state processes all packets that arrive at the PIM module from IGMP.			***/",
		"/***		The data in the ICI are gathered and assigned to local variables.				***/ ",
		"/***********************************************************************************************/",
		"",
		"in_pkptr = op_pk_get(op_intrpt_strm());",
		"ici_ptr = op_intrpt_ici();",
		"op_ici_attr_get(ici_ptr, \"dest_net\", &msg_type);",
		"op_ici_attr_get(ici_ptr, \"dest_node\", &group_no);",
		"op_ici_attr_get(ici_ptr, \"src_net\", &src_net);",
		"op_ici_attr_get(ici_ptr, \"src_node\", &src_node);",
		"op_ici_attr_get(ici_ptr, \"instrm\", &instrm);",
		"",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [22]' */
	prg_lptr [22] = prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [19], 
		"name",                 COMP_CONTENTS, "FROM_IGMP",
		"enter execs",          COMP_CONTENTS, prg_lptr [21],
		"exit execs",           COMP_CONTENTS, prg_lptr [22],
		"status",               COMP_TOGGLE,   EMAC_ENABLED,
		"position",             COMP_CONTENTS, obj [20],
		"initial",              COMP_TOGGLE,   EMAC_DISABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [21]' */
	/* create and init prg list 'prg_lptr [23]' */
	prg_lptr [23] = prg_list_create ();
	prg_list_strings_append (prg_lptr [23], 
		"/******************************************************************************/",
		"/***					Enter executives for the state						***/",
		"/***							NEW_GROUP									***/",
		"/***			This state is entered the first time a host					***/ ",
		"/***		on the directly-connected LAN sends a packet to a group.		***/",
		"/*** The data is encapsulted in a PIM_REGISTER message and sent to the RP.	***/",
		"/******************************************************************************/",
		"",
		"",
		"if( op_prg_odb_ltrace_active(\"pim_sm\") || op_prg_odb_ltrace_active(\"nrl_all\") ",
		"		|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"	printf(\"\\n%6.3f (%3d, %d) PIM_SM: Entering state NEW_GROUP.\",",
		"			op_sim_time(),net_num0,node_num0);",
		"",
		"/********************************************/",
		"/* If the data packet came from a host		*/",
		"/*	on a directly connected LAN,			*/",
		"/*	send a PIM_REGISTER message to the RP.	*/",
		"/********************************************/",
		"if (instrm == MAC_LAYER)",
		"	{",
		"	RP = RPTable[group_no][0];",
		"	out_pkptr = op_pk_create_fmt(\"pim_register\");",
		"	op25_pk_nfd_set(out_pkptr,\"data\",in_pkptr);",
		"",
		"	if( op_prg_odb_ltrace_active(\"pim_sm\") || op_prg_odb_ltrace_active(\"nrl_all\")",
		"		|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"		printf(\"\\n%6.3f (%3d, %d) PIM_SM: PIM_REGISTER message generated for (%d-%d, %d).\",",
		"				op_sim_time(),net_num0,node_num0,RP_bit,RP,group_no);",
		"",
		"	op_ici_attr_set(net_ici_ptr, \"dest_net\", PIM_REGISTER);",
		"	op_ici_attr_set(net_ici_ptr, \"dest_node\", group_no);",
		"	op_ici_attr_set(net_ici_ptr, \"src_net\", src_net);",
		"	op_ici_attr_set(net_ici_ptr, \"src_node\",src_node);",
		"	op_ici_attr_set(net_ici_ptr, \"source\", RP);",
		"	op_ici_attr_set(net_ici_ptr, \"RP_bit\", 1);",
		"	op_ici_install(net_ici_ptr);",
		"	op_pk_send(out_pkptr,TO_IP_ENCAP);",
		"	}",
		"",
		"else",
		"	op_pk_destroy(in_pkptr);",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [24]' */
	prg_lptr [24] = prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [21], 
		"name",                 COMP_CONTENTS, "NEW_GROUP",
		"enter execs",          COMP_CONTENTS, prg_lptr [23],
		"exit execs",           COMP_CONTENTS, prg_lptr [24],
		"status",               COMP_TOGGLE,   EMAC_ENABLED,
		"position",             COMP_CONTENTS, obj [22],
		"initial",              COMP_TOGGLE,   EMAC_DISABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [23]' */
	/* create and init prg list 'prg_lptr [25]' */
	prg_lptr [25] = prg_list_create ();
	prg_list_strings_append (prg_lptr [25], 
		"/***********************************************************************************************/",
		"/***						Enter executives for the state									***/",
		"/***                                   	PRUNE												***/",
		"/***		This state is reached when either an (S,G) or (*,G) PIM_PRUNE message			***/",
		"/***							arrives at a router.										***/",
		"/***			The instream is removed from the output interface (oif) list.				***/",
		"/***		  Another PIM_PRUNE message will be sent if the oif list is empty. 				***/",
		"/**********************************************************************************************/",
		"",
		"",
		"if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"	|| op_prg_odb_ltrace_active(\"nrl_all\")",
		"	|| op_prg_odb_ltrace_active(\"prune\")",
		"	|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"		{",
		"		printf(\"\\n%6.3f (%3d, %d) PIM_SM: Entering state PIM_PRUNE.\",",
		"			op_sim_time(),net_num0,node_num0);",
		"		printf(\"\\n%6.3f (%3d, %d) PIM_SM: Attempt to prune:  RP_bit = %d; WC_bit = %d; RP or Source = %d; Group = %d.\",",
		"			op_sim_time(),net_num0,node_num0,RP_bit,WC_bit,source,group_no);",
		"		}",
		"",
		"",
		"/****************************************************/",
		"/* Determine which set of PIM entries to examine.	*/",
		"/* If WC_bit = 1, then the linked list beginning	*/",
		"/*	at PIMWCListPointerLoc[][] is examined.			*/",
		"/* These entries are on RP based trees.				*/",
		"/* If WC_bit = 0, then the linked list beginning	*/",
		"/*	at PIMPointerLoc[][] is examined.				*/",
		"/* These entries are on source based trees			*/",
		"/*	or (S,G,RP) trees.								*/	",
		"/****************************************************/",
		"if (WC_bit)",
		"	p = PIMWCListPointerLoc[net_num0][node_num0];",
		"else",
		"	p = PIMPointerLoc[net_num0][node_num0];",
		"q = list;",
		"",
		"",
		"/****************************************************************************/",
		"/* 	Search for the (S, G) or (*, G) entry for this router. 					*/",
		"/*  Update the output interface list to remove the port for the instream. 	*/",
		"/* 	If the output interface is empty, send another PIM_PRUNE upstream. 		*/",
		"/****************************************************************************/",
		"",
		"flag = 0;",
		"strm_flag = 0;",
		"while (p && !flag)",
		"	{",
		"	if ( p->Group == group_no && p->Source == source )",
		"		{",
		"		flag = 1;",
		"",
		"		if( op_prg_odb_ltrace_active(\"pim_sm\") || op_prg_odb_ltrace_active(\"nrl_all\") || op_prg_odb_ltrace_active(\"prune\")",
		"			|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"					if (WC_bit)",
		"						printf(\"\\n%6.3f (%3d, %d) PIM_SM: Examining the (*, %d) entry.\",",
		"								op_sim_time(),net_num0,node_num0,group_no);",
		"					else",
		"						printf(\"\\n%6.3f (%3d, %d) PIM_SM: Examining the (%d, %d) entry.\",",
		"								op_sim_time(),net_num0,node_num0,p->Source,group_no);",
		"",
		"		temp = p->oif;",
		"",
		"		/****************************************************************/",
		"		/* Update the output interface of this PIM entry, if necessary. */",
		"		/****************************************************************/",
		"		if (p->oif & (int)pow(2.0,(float)instrm))",
		"			{",
		"			p->oif = p->oif ^ (int)pow(2.0,(float)instrm);",
		"",
		"			if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"				|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"				|| op_prg_odb_ltrace_active(\"prune\")",
		"				|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"					{",
		"					printf(\"\\n%6.3f (%3d, %d) PIM_SM: Output interface of (%d, %d) entry updated from %d to %d.\",",
		"							op_sim_time(),net_num0,node_num0,p->Source,group_no,temp,p->oif);",
		"					printf(\"\\n%6.3f (%3d, %d) PIM_SM: 		RP = (%d, %d)\",",
		"							op_sim_time(),net_num0,node_num0,RPTable[group_no][0],RPTable[group_no][1]);",
		"					}",
		"			}",
		"		",
		"		/****************************************************************/",
		"		/* If the output interface list is empty,						*/",
		"		/*	forward the prune appropriately								*/",
		"		/*	and either (1) change the (S,G) entry to an (S,G,RP) entry	*/",
		"		/*	or (2) remove the (S,G) entry.								*/",
		"		/****************************************************************/",
		"		if (p->oif == 0 && (net_num0 != RPTable[group_no][0] || node_num0 != RPTable[group_no][1]) )",
		"			{",
		"			if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"					|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"					|| op_prg_odb_ltrace_active(\"prune\")",
		"					|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"						printf(\"\\n%6.3f (%3d, %d) PIM_SM: Sending prune for (%d, %d) entry\",",
		"								op_sim_time(),net_num0,node_num0,p->Source,group_no);",
		"",
		"			/****************************************/",
		"			/*	Send PIM_PRUNE 						*/",
		PRGC_NIL);

	prg_list_strings_append (prg_lptr [25], 
		"			/****************************************/",
		"			out_pkptr = op_pk_create(PIM_PRUNE_PK_SIZE);",
		"			op_ici_attr_set(net_ici_ptr,\"dest_net\",PIM_PRUNE);",
		"			op_ici_attr_set(net_ici_ptr,\"dest_node\",group_no);",
		"			op_ici_attr_set(net_ici_ptr,\"src_net\",net_num0);",
		"			op_ici_attr_set(net_ici_ptr,\"src_node\",node_num0);",
		"			op_ici_attr_set(net_ici_ptr, \"source\",source);",
		"			op_ici_attr_set(net_ici_ptr,\"RP_bit\",RP_bit);",
		"			op_ici_attr_set(net_ici_ptr,\"WC_bit\",WC_bit);",
		"			op_ici_install(net_ici_ptr);                   ",
		"			op_pk_send_forced(out_pkptr,TO_IP_ENCAP);",
		"",
		"			/****************************************/",
		"			/* The variable \"strm_flag\" 			*/",
		"			/*	flags when the (S,G) entry 			*/",
		"			/*	should be removed. 					*/",
		"			/****************************************/",
		"			if (WC_bit)",
		"				strm_flag = 1;",
		"			else",
		"				{",
		"				ip_rte_sup_route_select(rte_table_ptr, RPTable[group_no][0], RPTable[group_no][1], &next_net, &next_node, &outstrm, &mtu);",
		"",
		"				if (outstrm == p->iif)",
		"					strm_flag = 1;",
		"",
		"				else",
		"					{",
		"					r = PIMWCListPointerLoc[net_num0][node_num0];",
		"					flag2 = 0;",
		"					while (r && !flag2)",
		"						{",
		"						if (r->Group == group_no)",
		"							{",
		"							p->oif = r->oif;",
		"							p->RP_bit = 1;",
		"							p->iif = outstrm;",
		"							p->last_use = op_sim_time();",
		"							flag2 = 1;",
		"							}",
		"						r=r->next;",
		"						}",
		"",
		"					if (!flag2)",
		"						strm_flag = 1;",
		"",
		"					}",
		"				}",
		"			if( op_prg_odb_ltrace_active(\"prune_list\")) ",
		"				printf(\"\\n***** strm_flag set to %d\",strm_flag);",
		"			}",
		"        /*********************/",
		"		/* Remove PIM entry. */",
		"		/*********************/",
		"		if (strm_flag)",
		"			{",
		"			if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"					|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"					|| op_prg_odb_ltrace_active(\"prune\")",
		"					|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"						printf(\"\\n%6.3f (%3d, %d) PIM_SM: Removing the (%d, %d) entry\",",
		"								op_sim_time(),net_num0,node_num0,p->Source,group_no);",
		"		  	if (q)",
		"				{",
		"				q->next = p->next;",
		"				op_prg_mem_free(p);",
		"				p=q->next;",
		"				}",
		"			else if (WC_bit)",
		"				{",
		"				PIMWCListPointerLoc[net_num0][node_num0] = p->next;",
		"				op_prg_mem_free(p);",
		"				p = PIMWCListPointerLoc[net_num0][node_num0];",
		"				}",
		"			else",
		"				{",
		"				PIMPointerLoc[net_num0][node_num0] = p->next;",
		"				op_prg_mem_free(p);",
		"				p = PIMPointerLoc[net_num0][node_num0];",
		"				}",
		"			}",
		"		else",
		"			{",
		"			q=p;",
		"			p=p->next;",
		"			}",
		"		}",
		"	else",
		"		{",
		"		q=p;",
		"		p=p->next;",
		"		}",
		"    }",
		"",
		"/****************************************/",
		"/* If a (*,G) entry was removed,		*/",
		"/*	also remove every (S,G,RP) entry.	*/",
		"/****************************************/",
		"if (strm_flag && WC_bit)",
		"	{",
		PRGC_NIL);

	prg_list_strings_append (prg_lptr [25], 
		"if (op_prg_odb_ltrace_active(\"prune_list\"))",
		"	printf(\"\\n***** Attempting to remove the (S, %d, RP) entries. strm_flag = %d\",group_no,strm_flag);",
		"    p=PIMPointerLoc[net_num0][node_num0];",
		"	q=list;",
		"	while (p)",
		"		{",
		"if (op_prg_odb_ltrace_active(\"prune_list\"))",
		"	printf(\"\\n***** (S,G,RP) = (%d, %d,%d)\",p->Source,p->Group,p->RP_bit);",
		"        if (p->Group == group_no && p->RP_bit == 1)",
		"			{",
		"			if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"				|| op_prg_odb_ltrace_active(\"nrl_all\")",
		"				|| op_prg_odb_ltrace_active(\"prune\")",
		"				|| op_prg_odb_ltrace_active(\"prune_list\")",
		"				|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"				printf(\"\\n%6.3f (%3d, %d) PIM_SM: (%d, %d, RP_bit) entry deleted since (*,G) entry deleted.\",",
		"						op_sim_time(),net_num0,node_num0,p->Source,p->Group,group_no);",
		"",
		"			/* Remove this entry */",
		"			if(q)",
		"				{",
		"				q->next = p->next;",
		"				free(p);",
		"				p=q->next;",
		"				}",
		"			else",
		"				{",
		"				PIMWCListPointerLoc[net_num0][node_num0] = p->next;",
		"				free(p);",
		"				p = PIMWCListPointerLoc[net_num0][node_num0];",
		"				}",
		"			}",
		"		else",
		"			{",
		"			q=p;",
		"			p=p->next;",
		"			}",
		"		}",
		"	}",
		"	",
		"",
		"",
		"",
		"if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"	|| op_prg_odb_ltrace_active(\"nrl_all\")",
		"	|| op_prg_odb_ltrace_active(\"prune\") ",
		"	|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"		if (strm_flag)",
		"			printf(\"\\n%6.3f (%3d, %d) PIM_SM: PIM_PRUNE message generated for group %d.\",",
		"						op_sim_time(),net_num0,node_num0,group_no);",
		"		else",
		"			printf(\"\\n%6.3f (%3d, %d) PIM_SM: No additional PIM_PRUNE messages were generated.\",",
		"				op_sim_time(),net_num0,node_num0);",
		"",
		"",
		"",
		"op_pk_destroy(in_pkptr);",
		"",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [26]' */
	prg_lptr [26] = prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [23], 
		"name",                 COMP_CONTENTS, "PRUNE",
		"enter execs",          COMP_CONTENTS, prg_lptr [25],
		"exit execs",           COMP_CONTENTS, prg_lptr [26],
		"status",               COMP_TOGGLE,   EMAC_ENABLED,
		"position",             COMP_CONTENTS, obj [24],
		"initial",              COMP_TOGGLE,   EMAC_DISABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [25]' */
	/* create and init prg list 'prg_lptr [27]' */
	prg_lptr [27] = prg_list_create ();
	prg_list_strings_append (prg_lptr [27], 
		"/**********************************************************************************************/",
		"/***                            Enter executives for the state								***/",
		"/***                                      REGISTER											***/",
		"/***			A PIM_REGISTER message enters this state when it reaches the RP.			***/",
		"/***				A PIM_REGISTER_STOP message is sent to the source,						***/",
		"/***				the data encapsulated in the PIM_REGISTER message						***/",
		"/***						is forwarded on the shared tree,								***/",
		"/***					an (S,G) PIM entry is created at the RP,  							***/",
		"/***				and an (S,G) PIM_JOIN is sent towards the source.						***/",
		"/**********************************************************************************************/",
		"",
		"if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"		|| op_prg_odb_ltrace_active(\"register\") ",
		"		|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"		|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"	printf(\"\\n%6.3f (%3d, %d) PIM_SM: Entering state PIM_REGISTER.\",",
		"		op_sim_time(),net_num0,node_num0);",
		"",
		"/* This state should only be reached at the RP. */",
		"if (RPTable[group_no][0] != net_num0 || RPTable[group_no][1] != node_num0)",
		"	printf(\"\\nARRIVED AT PIM_REGISTER STATE INCORRECTLY!\");",
		"",
		"/********************************************************/",
		"/* Send a PIM_REGISTER_STOP packet towards the source.	*/",
		"/********************************************************/",
		"",
		"out_pkptr = op_pk_create(PIM_REG_STOP_PK_SIZE);",
		"op_ici_attr_set(net_ici_ptr, \"dest_net\", PIM_REGISTER_STOP);",
		"op_ici_attr_set(net_ici_ptr, \"dest_node\", group_no);",
		"op_ici_attr_set(net_ici_ptr, \"src_net\", net_num0);",
		"op_ici_attr_set(net_ici_ptr, \"src_node\", node_num0);",
		"op_ici_attr_set(net_ici_ptr, \"source\", src_net);",
		"op_ici_attr_set(net_ici_ptr, \"RP_bit\", 0);",
		"op_ici_install(net_ici_ptr);",
		"op_pk_send_forced(out_pkptr,TO_IP_ENCAP);",
		"",
		"if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"	|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"	|| op_prg_odb_ltrace_active(\"register\") ",
		"	|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"		printf(\"\\n%6.3f (%3d, %d) PIM_SM: PIM_REGISTER_STOP message generated for (%d-%d, %d).\",",
		"				op_sim_time(),net_num0,node_num0,RP_bit,source,group_no);",
		"",
		"",
		"/********************************************************/",
		"/* Send data portion of the packet on the (S,G) tree. 	*/",
		"/********************************************************/",
		"",
		"op_pk_nfd_get(in_pkptr,\"data\",&data_pkptr);",
		"op_ici_attr_set(net_ici_ptr, \"dest_net\", MULTICAST_MSG);",
		"op_ici_attr_set(net_ici_ptr, \"dest_node\", group_no);",
		"op_ici_attr_set(net_ici_ptr, \"src_net\", src_net);",
		"op_ici_attr_set(net_ici_ptr, \"src_node\", src_node);",
		"op_ici_attr_set(net_ici_ptr, \"source\", src_net);",
		"op_ici_attr_set(net_ici_ptr, \"RP_bit\",1);",
		"op_ici_install(net_ici_ptr);",
		"op_pk_send_forced(data_pkptr,TO_IP_ENCAP);",
		"",
		"if( op_prg_odb_ltrace_active(\"pim_sm\") || op_prg_odb_ltrace_active(\"nrl_all\") ",
		"	|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"	printf(\"\\n%6.3f (%3d, %d) PIM_SM: Forwarding the data portion of the packet on the (%d, %d) tree.\",",
		"		op_sim_time(),net_num0,node_num0,src_net,group_no);",
		"",
		"/********************************************************/",
		"/* Determine if a (S,G) entry exists. 					*/",
		"/********************************************************/",
		"p = PIMPointerLoc[net_num0][node_num0];",
		"flag = 0;",
		"while (p && !flag)",
		"	{             ",
		"	p->last_use = op_sim_time();",
		"	if (p->Group == group_no && p->Source == src_net)",
		"		flag = 1;",
		"	p=p->next;",
		"	}",
		"",
		"/********************************************************/",
		"/*	Create an (S,G) PIM entry.							*/	",
		"/********************************************************/",
		"if (!flag)",
		"	{",
		"	p=(struct PIMentry*)op_prg_mem_alloc(sizeof(struct PIMentry));",
		"	p->Group = group_no;",
		"	p->Source = src_net;",
		"	p->iif = instrm;",
		"	p->RP_bit = 0;",
		"	p->WC_bit = 0;",
		"	p->SPT = 0;",
		"	p->last_use = op_sim_time();",
		"	p->next = PIMPointerLoc[net_num0][node_num0];",
		"",
		"	flag2 = 0;",
		"	q=PIMWCListPointerLoc[net_num0][node_num0];",
		"	while (q && !flag2)",
		"		{",
		"		if (q->Group == group_no)",
		"			{",
		"			p->oif = q->oif^(int)pow(2.0,(float)instrm);",
		"			flag2 = 1;",
		"			}",
		PRGC_NIL);

	prg_list_strings_append (prg_lptr [27], 
		"		q=q->next;",
		"		}",
		"",
		"	if (!flag2)",
		"		printf(\"\\n%6.3f  *** No (*, %d) entry found at RP (%d,%d).\",op_sim_time(),group_no,net_num0,node_num0);",
		"",
		"	PIMPointerLoc[net_num0][node_num0]=p;",
		"	if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"		|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"		|| op_prg_odb_ltrace_active(\"register\") ",
		"		|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"			printf(\"\\n%6.3f (%3d, %d) PIM_SM: (%d, %d) PIM entry added at the RP oif = %d.\",",
		"				op_sim_time(),net_num0,node_num0,src_net,group_no,p->oif);",
		"	}",
		"",
		"/********************************************************/",
		"/* Send a PIM_JOIN request towards the source. 			*/",
		"/********************************************************/",
		"out_pkptr = op_pk_create(PIM_JOIN_PK_SIZE);",
		"op_ici_attr_set(net_ici_ptr, \"dest_net\", PIM_JOIN);",
		"op_ici_attr_set(net_ici_ptr, \"dest_node\", group_no);",
		"op_ici_attr_set(net_ici_ptr, \"src_net\", net_num0);",
		"op_ici_attr_set(net_ici_ptr, \"src_node\", node_num0);",
		"op_ici_attr_set(net_ici_ptr, \"source\", src_net);",
		"op_ici_attr_set(net_ici_ptr, \"RP_bit\",0);",
		"op_ici_attr_set(net_ici_ptr, \"WC_bit\",0);",
		"op_ici_install(net_ici_ptr);",
		"op_pk_send(out_pkptr,TO_IP_ENCAP);",
		"if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"	|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"	|| op_prg_odb_ltrace_active(\"register\") ",
		"	|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"		printf(\"\\n%6.3f (%3d, %d) PIM_SM: PIM_JOIN message generated for source %d and group %d.\",",
		"				op_sim_time(),net_num0,node_num0,RP_bit,source,group_no);",
		"",
		"",
		"",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [28]' */
	prg_lptr [28] = prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [25], 
		"name",                 COMP_CONTENTS, "REGISTER",
		"enter execs",          COMP_CONTENTS, prg_lptr [27],
		"exit execs",           COMP_CONTENTS, prg_lptr [28],
		"status",               COMP_TOGGLE,   EMAC_ENABLED,
		"position",             COMP_CONTENTS, obj [26],
		"initial",              COMP_TOGGLE,   EMAC_DISABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [27]' */
	/* create and init prg list 'prg_lptr [29]' */
	prg_lptr [29] = prg_list_create ();
	prg_list_strings_append (prg_lptr [29], 
		"/*************************************************************************************************/",
		"/***                          Enter executives for the state                                   ***/",
		"/***                                   REG_STOP                                                ***/",
		"/***       PIM_REGISTER_STOP messages are sent from the RP to the source in response           ***/",
		"/***               to PIM_REGISTER messages sent from the source to the RP.                    ***/",
		"/***   This state is only reached when the PIM_REGISTER_STOP message reaches the source.       ***/",
		"/***					If no (S,G) entry exists, create one.								   ***/",
		"/*************************************************************************************************/",
		"",
		"if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"		|| op_prg_odb_ltrace_active(\"nrl_all\")",
		"		|| op_prg_odb_ltrace_active(\"register\")",
		"		|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"	printf(\"\\n%6.3f (%3d, %d) PIM_SM: Entering state PIM_REG_STOP.\",",
		"		op_sim_time(),net_num0,node_num0);",
		"",
		"p=PIMPointerLoc[net_num0][node_num0];",
		"flag = 0;",
		"",
		"while (p && !flag)",
		"	{",
		"	if (p->Group == group_no && p->Source == net_num0)",
		"		flag = 1;",
		"	p=p->next;",
		"	}",
		"",
		"if (!flag)",
		"	{",
		"	/**************************************/",
		"	/* Create an (S,G) entry for group G. */",
		"	/**************************************/",
		"	p = (struct PIMentry*) op_prg_mem_alloc(sizeof(struct PIMentry));",
		"	p->Group = group_no;",
		"	p->Source = net_num0;",
		"	p->oif = 0;",
		"	p->iif = MAC_LAYER;",
		"	p->RP_bit = 0;",
		"	p->WC_bit = 0;",
		"	p->SPT = 0;",
		"	p->last_use = op_sim_time();",
		"	p->next = PIMPointerLoc[net_num0][node_num0];",
		"	PIMPointerLoc[net_num0][node_num0] = p;",
		"	}",
		"",
		"op_pk_destroy(in_pkptr);",
		"",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [30]' */
	prg_lptr [30] = prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [27], 
		"name",                 COMP_CONTENTS, "REG_STOP",
		"enter execs",          COMP_CONTENTS, prg_lptr [29],
		"exit execs",           COMP_CONTENTS, prg_lptr [30],
		"status",               COMP_TOGGLE,   EMAC_ENABLED,
		"position",             COMP_CONTENTS, obj [28],
		"initial",              COMP_TOGGLE,   EMAC_DISABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [29]' */
	/* create and init prg list 'prg_lptr [31]' */
	prg_lptr [31] = prg_list_create ();
	prg_list_strings_append (prg_lptr [31], 
		"/**************************************************************************************************/",
		"/***                          Enter executives for the state                                   	***/",
		"/***                                   SPT_SETUP                                               	***/",
		"/***			This packet is reached when a packet arrives from a source 						***/",
		"/***					whose SPT bit in its (S,G) entry is cleared.							***/",
		"/***			If the Source Based Tree Option of Sparse PIM has been requested,				***/",
		"/***			and if the path to the source differs from the path to the RP,					***/",
		"/***					a PIM_JOIN is sent to join the source-based tree						***/ ",
		"/***					and a PIM_PRUNE is sent to leave the shared tree.						***/	",
		"/**************************************************************************************************/",
		"",
		"",
		"if( op_prg_odb_ltrace_active(\"pim_sm\") || op_prg_odb_ltrace_active(\"nrl_all\") ",
		"		|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"	printf(\"\\n%6.3f (%3d, %d) PIM_SM: Entering state SPT_SETUP.\",",
		"			op_sim_time(),net_num0,node_num0);",
		"",
		"if (PIM_sbt_switch)",
		"{",
		"/****************************************************/",
		"/* Determine if an (S,G) entry exists. 				*/",
		"/* If an entry exists, send a prune toward (where??)*/",
		"/*	asking to prune off the shared tree. 			*/",
		"/****************************************************/",
		"p = PIMPointerLoc[net_num0][node_num0];",
		"flag = 0;",
		"while (p && !flag)                 ",
		"	{",
		"	if (p->Source == source && p->Group == group_no)",
		"		{",
		"  			if( op_prg_odb_ltrace_active(\"pim_sm\") || op_prg_odb_ltrace_active(\"nrl_all\") ",
		"				|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"				printf(\"\\n%6.3f (%3d, %d) PIM_SM: (%d, %d) entry found.\",",
		"					op_sim_time(),net_num0,node_num0,source,group_no);",
		"		flag = 1;",
		"		flag2 = 0;",
		"		q = PIMWCListPointerLoc[net_num0][node_num0];",
		"		while(q && !flag2)",
		"			{",
		"			if (q->Group == source)",
		"				{",
		"				flag2 = 1;",
		"                shared_instrm = q->iif;",
		"				}",
		"			q=q->next;",
		"			}",
		"",
		"		if (flag2 && p->iif != shared_instrm)",
		"			{",
		"  			if( op_prg_odb_ltrace_active(\"pim_sm\") || op_prg_odb_ltrace_active(\"nrl_all\") ",
		"				|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"				printf(\"\\n%6.3f (%3d, %d) PIM_SM: Prune off shared tree.  iif of (*,G) entry = %d.  iif entry of (S,G) entry = %d.\",",
		"					op_sim_time(),net_num0,node_num0,shared_instrm,p->iif);",
		"",
		"			out_pkptr = op_pk_create(PIM_PRUNE_PK_SIZE);",
		"			op_ici_attr_set(net_ici_ptr,\"dest_net\",PIM_PRUNE);",
		"			op_ici_attr_set(net_ici_ptr,\"dest_node\",group_no);",
		"			op_ici_attr_set(net_ici_ptr,\"src_net\",net_num0);",
		"			op_ici_attr_set(net_ici_ptr,\"src_node\",node_num0);",
		"			op_ici_attr_set(net_ici_ptr,\"source\",source);",
		"			op_ici_attr_set(net_ici_ptr,\"RP_bit\",1);",
		"			op_ici_attr_set(net_ici_ptr,\"WC_bit\",0);",
		"			op_ici_install(net_ici_ptr);                   ",
		"/*			op_pk_send_forced(out_pkptr,TO_IP_ENCAP);	*/",
		"			}",
		"		}",
		"	p=p->next;",
		"	}",
		"",
		"/****************************************************/",
		"/* If no entry exists, 								*/",
		"/*	create an (S,G) entry for group G. 				*/",
		"/****************************************************/",
		"if (!flag)",
		"	{",
		"	ip_rte_sup_route_select(rte_table_ptr, src_net, 0, &next_net, &next_node, &outstrm, &mtu);",
		"	p = (struct PIMentry*) op_prg_mem_alloc(sizeof(struct PIMentry));",
		"	p->Group = group_no;",
		"	p->Source = src_net;",
		"	p->iif = outstrm;",
		"	p->oif = (int)pow(2.0,(float)MAC_LAYER);",
		"	p->RP_bit = 0;",
		"	p->WC_bit = 0;",
		"	p->SPT = 0;",
		"	p->last_use = op_sim_time();",
		"	p->next = PIMPointerLoc[net_num0][node_num0];",
		"	PIMPointerLoc[net_num0][node_num0] = p;",
		"",
		"	if( op_prg_odb_ltrace_active(\"pim_sm\") || op_prg_odb_ltrace_active(\"nrl_all\")",
		"		|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"		printf(\"\\n%6.3f (%3d, %d) PIM_SM: A PIM entry for (%d ,%d) was added.\",",
		"				op_sim_time(),net_num0,node_num0,src_net,group_no);",
		"",
		"	/******************************************/",
		"	/* Send a PIM_JOIN packet towards the RP. */",
		"	/******************************************/",
		"	if( op_prg_odb_ltrace_active(\"pim_sm\") || op_prg_odb_ltrace_active(\"nrl_all\")",
		"		|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"		  printf(\"\\n%6.3f (%3d, %d) PIM_SM: PIM_JOIN message generated for group %d and source = %d.\",",
		"				op_sim_time(),net_num0,node_num0,group_no,src_net);",
		PRGC_NIL);

	prg_list_strings_append (prg_lptr [31], 
		"	out_pkptr = op_pk_create(PIM_JOIN_PK_SIZE);",
		"	op_ici_attr_set(net_ici_ptr, \"dest_net\", PIM_JOIN);",
		"	op_ici_attr_set(net_ici_ptr, \"dest_node\", group_no);",
		"	op_ici_attr_set(net_ici_ptr, \"src_net\", net_num0);",
		"	op_ici_attr_set(net_ici_ptr, \"src_node\", node_num0);",
		"	op_ici_attr_set(net_ici_ptr, \"source\", src_net);",
		"	op_ici_attr_set(net_ici_ptr, \"RP_bit\", 0);",
		"	op_ici_attr_set(net_ici_ptr, \"WC_bit\", 0);",
		"	op_ici_install(net_ici_ptr);",
		"	op_pk_send_forced(out_pkptr,TO_IP_ENCAP);",
		"	}",
		"}",
		"",
		"op_pk_destroy(in_pkptr);",
		"",
		"",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [32]' */
	prg_lptr [32] = prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [29], 
		"name",                 COMP_CONTENTS, "SPT_SETUP",
		"enter execs",          COMP_CONTENTS, prg_lptr [31],
		"exit execs",           COMP_CONTENTS, prg_lptr [32],
		"status",               COMP_TOGGLE,   EMAC_ENABLED,
		"position",             COMP_CONTENTS, obj [30],
		"initial",              COMP_TOGGLE,   EMAC_DISABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [31]' */
	/* create and init prg list 'prg_lptr [33]' */
	prg_lptr [33] = prg_list_create ();
	prg_list_strings_append (prg_lptr [33], 
		"/**************************************************************************************************/",
		"/***                          Enter executives for the state                                   	***/",
		"/***									TIMER	                                             	***/",
		"/***				This state is reached when a timer with code 0 expires.						***/",
		"/*** An additional timer with code 0 is set for the current time plus TIMEOUT_LENGTH seconds.	***/",
		"/***	(S,G) PIM entries which have not been used in TIMEOUT_LENGTH seconds are deleted.		***/",
		"/***					(*,G) entries may be deleted in the future.								***/	",
		"/**************************************************************************************************/",
		"",
		"",
		"",
		"if((op_prg_odb_ltrace_active(\"pim_sm\")) ",
		"	|| (op_prg_odb_ltrace_active(\"nrl_all\")))",
		"		printf(\"\\n%6.3f (%3d, %d) PIM_SM: Entering state TIMEOUT.  Check if PIM entries should be timed out.\",",
		"					op_sim_time(),net_num0,node_num0);",
		"",
		"",
		"p = PIMPointerLoc[net_num0][node_num0];",
		"q = list;",
		"timer = op_sim_time() - TIMEOUT_LENGTH;",
		"        ",
		"if((op_prg_odb_ltrace_active(\"pim_sm\")) ",
		"	|| (op_prg_odb_ltrace_active(\"nrl_all\"))",
		"	|| (op_prg_odb_ltrace_active(\"sparse_pim_timer\")) )",
		"	printf(\"\\n%6.3f (%3d, %d) PIM_SM: The timer for the (S,G) groups has expired.  (*,G) entries are not being checked.\",",
		"		op_sim_time(),net_num0,node_num0);",
		"",
		"while(p)",
		"	if (p->last_use < timer)",
		"		if (q)",
		"			{",
		"",
		"if((op_prg_odb_ltrace_active(\"pim_sm\")) ",
		"	|| (op_prg_odb_ltrace_active(\"nrl_all\"))",
		"	|| (op_prg_odb_ltrace_active(\"sparse_pim_timer\")) )",
		"	printf(\"\\n%6.3f (%3d, %d) PIM_SM: PIM entry removed for source %d and group %d.\",",
		"		op_sim_time(),net_num0,node_num0,p->Source,p->Group);",
		"",
		"			q->next = p->next;",
		"			op_prg_mem_free (p);",
		"			p=q->next;",
		"			}",
		"		else",
		"			{",
		"if((op_prg_odb_ltrace_active(\"pim_sm\")) ",
		"	|| (op_prg_odb_ltrace_active(\"nrl_all\"))",
		"	|| (op_prg_odb_ltrace_active(\"sparse_pim_timer\")) )",
		"	printf(\"\\n%6.3f (%3d, %d) PIM_SM: PIM entry removed for source %d and group %d.\",",
		"		op_sim_time(),net_num0,node_num0,p->Source,p->Group);",
		"			PIMPointerLoc[net_num0][node_num0] = p->next;",
		"			op_prg_mem_free (p);",
		"			p = PIMPointerLoc[net_num0][node_num0];",
		"			}",
		"	else",
		"		{",
		"		q=p;",
		"		p=p->next;",
		"		}",
		"",
		"op_intrpt_schedule_self(op_sim_time() + TIMEOUT_LENGTH, 0);",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [34]' */
	prg_lptr [34] = prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [31], 
		"name",                 COMP_CONTENTS, "TIMER",
		"enter execs",          COMP_CONTENTS, prg_lptr [33],
		"exit execs",           COMP_CONTENTS, prg_lptr [34],
		"status",               COMP_TOGGLE,   EMAC_ENABLED,
		"position",             COMP_CONTENTS, obj [32],
		"initial",              COMP_TOGGLE,   EMAC_DISABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [33]' */
	/* create and init prg list 'prg_lptr [35]' */
	prg_lptr [35] = prg_list_create ();
	prg_list_strings_append (prg_lptr [35], 
		"/**************************************************************************************************/",
		"/***                          Enter executives for the state                                   	***/",
		"/***                                   RP_REPORT                                               	***/",
		"/***				This state is reached when an RP_REPORT arrives from a host.				***/",
		"/***							No action is currently taken. 									***/",
		"/**************************************************************************************************/",
		"",
		"if( op_prg_odb_ltrace_active(\"pim_sm\") || op_prg_odb_ltrace_active(\"nrl_all\") )",
		"	printf(\"\\n%6.3f (%3d, %d) PIM_SM: Entering state RP_REPORT.\",",
		"		op_sim_time(),net_num0,node_num0);",
		"",
		"op_pk_destroy(in_pkptr);",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [36]' */
	prg_lptr [36] = prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [33], 
		"name",                 COMP_CONTENTS, "RP_REPORT",
		"enter execs",          COMP_CONTENTS, prg_lptr [35],
		"exit execs",           COMP_CONTENTS, prg_lptr [36],
		"status",               COMP_TOGGLE,   EMAC_ENABLED,
		"position",             COMP_CONTENTS, obj [34],
		"initial",              COMP_TOGGLE,   EMAC_DISABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [35]' */
	/* create and init prg list 'prg_lptr [37]' */
	prg_lptr [37] = prg_list_create ();
	prg_list_strings_append (prg_lptr [37], 
		"/**************************************************************************************************/",
		"/***                          Enter executives for the state                                   	***/",
		"/***                               	SEND_PIM_QUERY                                             	***/",
		"/***				This state is entered when a timer with code 1 expires. 					***/",
		"/***			PIM_QUERY messages are sent to all directly connected routers.					***/  			",
		"/*** Another timer with code 1 is set to expire at QUERY_INTERVAL seconds from the current time.***/		",
		"/**************************************************************************************************/",
		"",
		"if((op_prg_odb_ltrace_active(\"pim_sm\")) ",
		"	|| (op_prg_odb_ltrace_active(\"nrl_all\")))",
		"		printf(\"\\n%6.3f (%3d, %d) PIM_SM: Entering state SEND_PIM_QUERY.\",",
		"					op_sim_time(),net_num0,node_num0);",
		"",
		"if( op_prg_odb_ltrace_active(\"pim_sm\") || op_prg_odb_ltrace_active(\"nrl_all\") )",
		"		printf(\"\\n%6.3f (%3d, %d) PIM_SM: PIM_QUERY message generated.\",",
		"				op_sim_time(),net_num0,node_num0);",
		"out_pkptr = op_pk_create(PIM_QUERY_PK_SIZE);",
		"op_ici_attr_set(net_ici_ptr, \"dest_net\", PIM_QUERY);",
		"op_ici_attr_set(net_ici_ptr, \"dest_node\", ALL_HOSTS);",
		"op_ici_attr_set(net_ici_ptr, \"src_net\", net_num0);",
		"op_ici_attr_set(net_ici_ptr, \"src_node\", node_num0);",
		"op_ici_install(net_ici_ptr);",
		"op_pk_send(out_pkptr,TO_IP_ENCAP);",
		"",
		"op_intrpt_schedule_self(op_sim_time()+QUERY_INTERVAL, 1);",
		"",
		"",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [38]' */
	prg_lptr [38] = prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [35], 
		"name",                 COMP_CONTENTS, "SEND_PIM_QUERY",
		"enter execs",          COMP_CONTENTS, prg_lptr [37],
		"exit execs",           COMP_CONTENTS, prg_lptr [38],
		"status",               COMP_TOGGLE,   EMAC_ENABLED,
		"position",             COMP_CONTENTS, obj [36],
		"initial",              COMP_TOGGLE,   EMAC_DISABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [37]' */
	/* create and init prg list 'prg_lptr [39]' */
	prg_lptr [39] = prg_list_create ();
	prg_list_strings_append (prg_lptr [39], 
		"/**************************************************************************************************/",
		"/***                          Enter executives for the state                                   	***/",
		"/***                                   PIM_QUERY                                               	***/",
		"/***			This state is reached when a PIM_QUERY arrives from another router.				***/",
		"/***							No action is currently taken. 									***/",
		"/**************************************************************************************************/",
		"",
		"if( op_prg_odb_ltrace_active(\"pim_sm\") || op_prg_odb_ltrace_active(\"nrl_all\") )",
		"		printf(\"\\n%6.3f (%3d, %d) PIM_SM:  Reached state PIM_QUERY.\",",
		"				op_sim_time(),net_num0,node_num0);",
		"",
		"op_pk_destroy(in_pkptr);",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [40]' */
	prg_lptr [40] = prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [37], 
		"name",                 COMP_CONTENTS, "PIM_QUERY",
		"enter execs",          COMP_CONTENTS, prg_lptr [39],
		"exit execs",           COMP_CONTENTS, prg_lptr [40],
		"status",               COMP_TOGGLE,   EMAC_ENABLED,
		"position",             COMP_CONTENTS, obj [38],
		"initial",              COMP_TOGGLE,   EMAC_DISABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [39]' */
	/* create and init prg list 'prg_lptr [41]' */
	prg_lptr [41] = prg_list_create ();
	prg_list_strings_append (prg_lptr [41], 
		"/******************************************************************************/",
		"/***					Enter executives for the state						***/",
		"/***						   JOIN_SHARED_TREE								***/",
		"/***			In this state, the (*,G) PIM entry is found					***/",
		"/***	and its output interface list is updated to include the instream.	***/",
		"/***				If no (*,G) entry exists, one is created.				***/",
		"/******************************************************************************/",
		"	",
		"",
		"",
		"",
		"if( op_prg_odb_ltrace_active(\"pim_sm\") || op_prg_odb_ltrace_active(\"nrl_all\") ",
		"		|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"	printf(\"\\n%6.3f (%3d, %d) PIM_SM: JOIN shared tree for group %d.  WC_bit = %d.\",",
		"			op_sim_time(),net_num0,node_num0,group_no,WC_bit);",
		"",
		"op_pk_nfd_get(in_pkptr,\"prune_list_ptr\",&prune_list_struct_ptr);",
		"prune_list_ptr =(List*) prune_list_struct_ptr->prune_list_ptr;",
		"prune_list_size = op_prg_list_size(prune_list_ptr);",
		"",
		"if (op_prg_odb_ltrace_active(\"prune_list\") && prune_list_size > 0)",
		"	printf(\"\\n ***** size of prune list = %d\",prune_list_size);",
		"    						",
		"",
		"/********************************************************/",
		"/* Search for a (*,G) entry for this router. 			*/",
		"/* If an entry exists, update the output interface list */",
		"/* 	to include the instream. 							*/",
		"/* If no (*,G) entry exists, add a (*,G) entry 			*/",
		"/*	and set flag = 0 to note 							*/",
		"/*	that another join should be sent.					*/",
		"/********************************************************/",
		"                         ",
		"p = PIMWCListPointerLoc[net_num0][node_num0];",
		"flag = 0;",
		"while (p && !flag)",
		"		{",
		"		if ((p->Source == source) && (p->Group == group_no))",
		"			{              ",
		"			flag = 1;",
		"			p->last_use = op_sim_time();",
		"			if ( (p->oif & (int)pow(2.0,(float)instrm)) == 0)",
		"				p->oif = p->oif | (int)pow(2.0,(float)instrm);",
		"			r=p;",
		"			}",
		"		p=p->next;",
		"		}",
		"",
		"	/**************************/",
		"	/* Create an (*,G) entry. */",
		"	/**************************/",
		"if (!flag)",
		"	{",
		"	p = (struct PIMentry*) op_prg_mem_alloc(sizeof(struct PIMentry));",
		"	p->Group = group_no;",
		"	p->Source = source;",
		"	if (net_num0 == source && node_num0 == RPTable[group_no][1])",
		"		p->iif = 0;",
		"	else",
		"		{",
		"		ip_rte_sup_route_select(rte_table_ptr, source, RPTable[group_no][1], &next_net, &next_node, &outstrm, &mtu);",
		"		p->iif = outstrm; ",
		"		}   ",
		"	p->oif = (int)pow(2.0,(float)instrm);",
		"	p->RP_bit = 1;",
		"	p->WC_bit = WC_bit;",
		"	p->SPT = 0;",
		"	p->last_use = op_sim_time();",
		"	p->next = PIMWCListPointerLoc[net_num0][node_num0];",
		"	PIMWCListPointerLoc[net_num0][node_num0] = p;",
		"",
		"	if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"		|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"		|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"		printf(\"\\n%6.3f (%3d, %d) PIM_SM: A PIM entry for (*, %d) was added.\",",
		"				op_sim_time(),net_num0,node_num0,group_no);",
		"",
		"	}",
		"",
		"",
		"/**************************************************/",
		"/*** Update all (S,G) entries 					***/",
		"/***	to include the instrm in the oif list	***/",
		"/***	if the source is not in the prune list.	***/",
		"/***	Additional processing is needed			***/",
		"/***	when the entry's RP_bit = 1.			***/",
		"/**************************************************/",
		"",
		"p=PIMPointerLoc[net_num0][node_num0];",
		"q=list;",
		"while (p)",
		"	{",
		"	if (p->Group == group_no)",
		"		{",
		"		p->last_use = op_sim_time();",
		"		if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"				|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"				|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"				printf(\"\\n%6.3f (%3d, %d) PIM_SM:  (%d, %d) entry found,  iif = %d, instrm = %d, oif = %d.\",",
		"					op_sim_time(),net_num0,node_num0,p->Source,p->Group,p->iif,instrm,p->oif);",
		PRGC_NIL);

	prg_list_strings_append (prg_lptr [41], 
		"",
		"		/************************************************/",
		"		/* Check if this source is in the prune_list. 	*/",
		"		/************************************************/",
		"		if (p->RP_bit == 1)",
		"			prune_flag = 1;",
		"		else",
		"			{",
		"			prune_flag = 0;",
		"       		for (i=0; i<prune_list_size && !prune_flag; i++)",
		"				{",
		"				prune_list_source_ptr = (Prune_list_source_ptr*)op_prg_list_access(prune_list_ptr,i);",
		"				prune_list_source = prune_list_source_ptr->source;",
		"				if ( prune_list_source == p->Source)",
		"					prune_flag = 1;",
		"				}",
		"			}",
		"",
		"if (prune_flag && op_prg_odb_ltrace_active(\"prune_list\"))",
		"	printf(\"\\n ***** Source %d will not be added to the prune_list\",p->Source);",
		"else if (!prune_flag && op_prg_odb_ltrace_active(\"prune_list\"))",
		"	printf(\"\\n ***** Source %d will be added to the prune_list\",p->Source);",
		"",
		"",
		"		",
		"        if (!prune_flag)",
		"			{",
		"			/****************************************/",
		"			/*	If this source is not in the prune 	*/",
		"			/*	list, add it to the prune list.		*/",
		"			/****************************************/",
		"			prune_list_source_ptr = (Prune_list_source_ptr*)op_prg_mem_alloc(sizeof(Prune_list_source_ptr));",
		"			prune_list_source_ptr->source = p->Source;",
		"			op_prg_list_insert(prune_list_ptr,prune_list_source_ptr,OPC_LISTPOS_TAIL);",
		"		",
		"			if (op_prg_odb_ltrace_active(\"prune_list\"))",
		"			printf(\"\\n%6.3f (%3d, %d) ****** Prune list updated: # = %d, source added = %d\",",
		"				op_sim_time(),net_num0,node_num0,op_prg_list_size(prune_list_ptr),p->Source);",
		"            }",
		"",
		"		/************************************/",
		"		/*	Update the oif list 			*/",
		"		/*	for all (S,G) entries.			*/",
		"		/************************************/",
		"		temp = p->oif;",
		"		if (   (p->oif & (int)pow(2.0,(float)instrm) ) == 0 ",
		"			&& (p->iif != instrm) )",
		"			{",
		"			p->oif = p->oif | (int)pow(2.0,(float)instrm);",
		"			if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"				|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"				|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"				printf(\"\\n%6.3f (%3d, %d) PIM_SM:  (%d, %d) entry updated to include interface.  oif = %d\",",
		"					op_sim_time(),net_num0,node_num0,p->Source,p->Group,p->oif);",
		"   	      	}",
		"",
		"		/****************************************************/",
		"		/* If this is an (S,G,RP) entry,					*/",
		"		/*	and if the entry's oif was changed from zero,	*/",
		"		/*	set flag = 0 to note that another (*,G) JOIN	*/",
		"		/* 	should be sent towards the RP.					*/",
		"		/****************************************************/",
		"				/****************************************/",
		"				/*				TO DO:					*/",
		"				/* If the oif of the (S,G,RP) entry 	*/",
		"				/*	matches the oif of the (*,G) entry, */",
		"				/* 	remove (S,G,RP) entry.				*/",
		"				/****************************************/",
		"",
		"		if (p->RP_bit)",
		"			if (!temp)",
		"				flag = 0;",
		"",
		"		}",
		"	q=p;",
		"	p=p->next;",
		"	}",
		"",
		"	",
		"/************************************************************/",
		"/*	If flag = 0, forward a PIM_JOIN packet towards the RP.	*/",
		"/*	If flag = 1, free the memory used by the prune list.	*/",
		"/************************************************************/",
		"if (flag)",
		"	{",
		"	op_prg_list_free(prune_list_ptr);",
		"	op_prg_mem_free(prune_list_ptr);",
		"	op_prg_mem_free(prune_list_struct_ptr);",
		"",
		"	if (op_prg_odb_ltrace_active(\"prune_list\") && prune_list_size >0)",
		"		printf(\"\\n ***** Prune list freed.\");",
		"	}",
		"",
		"else",
		"	{",
		"	/************************************/",
		"	/* If this is not the destination, 	*/",
		"	/* 	send a PIM_JOIN packet 			*/",
		"	/*	towards the RP.					*/",
		"	/************************************/",
		PRGC_NIL);

	prg_list_strings_append (prg_lptr [41], 
		"	if (net_num0 == source && node_num0== RPTable[group_no][1])",
		"		{",
		"        op_prg_list_free(prune_list_ptr);",
		"		op_prg_mem_free(prune_list_ptr);",
		"		op_prg_mem_free(prune_list_struct_ptr);",
		"",
		"		if (op_prg_odb_ltrace_active(\"prune_list\"))",
		"			printf(\"\\n ***** Prune list freed.\");",
		"		}",
		"",
		"	else 	",
		"		{",
		"		out_pkptr = op_pk_create_fmt(\"pim_join_pk_format\");",
		"		op_pk_bulk_size_set(out_pkptr,PIM_JOIN_PK_SIZE);",
		"",
		"		prune_list_struct_ptr = (Prune_list_struct*)op_prg_mem_alloc(sizeof(Prune_list_struct));",
		"		prune_list_struct_ptr->prune_list_ptr = prune_list_ptr;",
		"		op25_pk_nfd_set(out_pkptr,\"prune_list_ptr\",prune_list_struct_ptr,op_prg_mem_alloc,op_prg_mem_free,sizeof(Prune_list_struct));",
		"",
		"		op_ici_attr_set(net_ici_ptr, \"dest_net\", PIM_JOIN);",
		"		op_ici_attr_set(net_ici_ptr, \"dest_node\", group_no);",
		"		op_ici_attr_set(net_ici_ptr, \"src_net\", net_num0);",
		"		op_ici_attr_set(net_ici_ptr, \"src_node\", node_num0);",
		"		op_ici_attr_set(net_ici_ptr, \"source\",source);",
		"		op_ici_attr_set(net_ici_ptr, \"RP_bit\", 1);",
		"		op_ici_attr_set(net_ici_ptr, \"WC_bit\", 1);",
		"		op_ici_install(net_ici_ptr);",
		"		op_pk_send(out_pkptr,TO_IP_ENCAP);",
		"",
		"		if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"			|| op_prg_odb_ltrace_active(\"nrl_all\")",
		"			|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"			printf(\"\\n%6.3f (%3d, %d) PIM_SM: A PIM_JOIN for the (*, %d) tree was sent.\",",
		"				op_sim_time(),net_num0,node_num0,group_no);",
		"		}",
		"    }",
		"",
		"",
		"op_pk_destroy(in_pkptr);",
		"",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [42]' */
	prg_lptr [42] = prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [39], 
		"name",                 COMP_CONTENTS, "JOIN_SHARED_TREE",
		"enter execs",          COMP_CONTENTS, prg_lptr [41],
		"exit execs",           COMP_CONTENTS, prg_lptr [42],
		"status",               COMP_TOGGLE,   EMAC_ENABLED,
		"position",             COMP_CONTENTS, obj [40],
		"initial",              COMP_TOGGLE,   EMAC_DISABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [41]' */
	/* create and init prg list 'prg_lptr [43]' */
	prg_lptr [43] = prg_list_create ();
	prg_list_strings_append (prg_lptr [43], 
		"/******************************************************************************/",
		"/***					Enter executives for the state						***/",
		"/***							PRUNE_RPENTRY								***/",
		"/***		This state is reached when a PIM_PRUNE message is sent			***/",
		"/***					with RP_bit = 1 and WC_bit = 0.						***/",
		"/***				The interface on which the message arrived				***/",
		"/***			should be pruned for the (S,G) or (S,G,RP) entry.			***/",
		"/***				If the output interface list is empty,					***/",
		"/***				another PIM_PRUNE message should be sent.				***/",
		"/******************************************************************************/ ",
		"",
		"",
		"if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"	|| op_prg_odb_ltrace_active(\"nrl_all\")",
		"	|| op_prg_odb_ltrace_active(\"prune\")",
		"	|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"		{",
		"		printf(\"\\n%6.3f (%3d, %d) PIM_SM: Entering state PRUNE_RPENTRY.\",",
		"			op_sim_time(),net_num0,node_num0);",
		"		printf(\"\\n%6.3f (%3d, %d) PIM_SM: Attempt to prune:  RP_bit = %d; WC_bit = %d; RP or Source = %d; Group = %d.\",",
		"			op_sim_time(),net_num0,node_num0,RP_bit,WC_bit,source,group_no);",
		"		}",
		"	",
		"/****************************************************************************/",
		"/* 	Search for the (S,G) entry for this router. 							*/",
		"/*  Update the output interface list to remove the port for the instream. 	*/",
		"/* 	If the output interface is empty, send another PRUNE upstream. 			*/",
		"/****************************************************************************/",
		"",
		"/****************************************/",
		"/* Do not remove the entry 				*/",
		"/*	if this is the location of the RP.	*/",
		"/****************************************/",
		"flag = 0;",
		"flag2 = 0;",
		"",
		"/****************************************/",
		"/* Search for the (S,G) entry.			*/",
		"/****************************************/",
		"p = PIMPointerLoc[net_num0][node_num0];",
		"while (p && !flag)",
		"	{",
		"	if ( p->Group == group_no && p->Source == source )",
		"		{",
		"		if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"			|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"			|| op_prg_odb_ltrace_active(\"prune\")",
		"			|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"				printf(\"\\n%6.3f (%3d, %d) PIM_SM: Examining the (%d, %d) entry.\",",
		"						op_sim_time(),net_num0,node_num0,p->Source,group_no);",
		"		flag = 1;",
		"		",
		"		/****************************************/",
		"		/* Update the oif of the (S,G) entry.	*/",
		"		/****************************************/",
		"		if ( p->oif & (int)pow(2.0,(float)instrm) )",
		"			{",
		"			p->oif = p->oif ^ (int)pow(2.0,(float)instrm);",
		"			if (!p->oif)",
		"				flag2 = 0;",
		"			}",
		"		}",
		"	p=p->next;",
		"    }",
		"",
		"/********************************************************/",
		"/* If no (S,G) entry exists and this is not the RP,		*/",
		"/*	 create an (S,G,RP) entry.							*/",
		"/********************************************************/",
		"if (!flag ",
		"	&& (net_num0 != RPTable[group_no][0] || node_num0 != RPTable[group_no][1]))",
		"	{",
		"	if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"			|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"			|| op_prg_odb_ltrace_active(\"prune\")",
		"			|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"				printf(\"\\n%6.3f (%3d, %d) PIM_SM: No (%d, %d) entry found.\",",
		"						op_sim_time(),net_num0,node_num0,source,group_no);",
		"",
		"    /************************************/",
		"	/* Create an (S, G, RP) entry. 		*/",
		"	/* The oif list should mimic 		*/",
		"	/*	the oif list of the (*,G) entry	*/",
		"	/*	 with the instrm removed. 		*/",
		"    /************************************/",
		"	q = PIMWCListPointerLoc[net_num0][node_num0];",
		"	while (q && !flag2)",
		"		{",
		"		if (q->Group == group_no)",
		"			{",
		"			flag2 = 1;",
		"",
		"			/*******************************/",
		"			/* Create an (S, G, RP) entry. */",
		"			/*******************************/",
		"			p = (struct PIMentry*) op_prg_mem_alloc(sizeof(struct PIMentry));",
		"			p->Group = group_no;",
		"			p->Source = source;",
		"			ip_rte_sup_route_select(rte_table_ptr, RPTable[group_no][0], RPTable[group_no][1], &next_net, &next_node, &outstrm, &mtu);",
		"			p->iif = outstrm;",
		PRGC_NIL);

	prg_list_strings_append (prg_lptr [43], 
		"			if (q->oif & (int)pow(2.0,(float)instrm) ) ",
		"				p->oif = q->oif ^ (int)pow(2.0,(float)instrm);",
		"			else",
		"				p->oif = q->oif;",
		"			p->RP_bit = 1;",
		"			p->WC_bit = 0;",
		"			p->SPT = 0;",
		"			p->last_use = op_sim_time();",
		"			p->next = PIMPointerLoc[net_num0][node_num0];",
		"			PIMPointerLoc[net_num0][node_num0] = p;",
		"",
		"			if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"			|| op_prg_odb_ltrace_active(\"nrl_all\") ",
		"			|| op_prg_odb_ltrace_active(\"prune\")",
		"			|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"				printf(\"\\n%6.3f (%3d, %d) PIM_SM: (%d, %d, RP) entry created.\",",
		"						op_sim_time(),net_num0,node_num0,source,group_no);",
		"",
		"			}",
		"		q = q->next;",
		"		}",
		"	}",
		"",
		"/********************************************************/",
		"/* If the output interface 								*/",
		"/*	of the (S,G) or (S,G,RP) entry is empty,			*/",
		"/*	forward an (S,G,RP) PIM_PRUNE towards the RP.		*/",
		"/********************************************************/",
		"if (flag2)",
		"	{",
		"	/* Forward the prune toward the RP. */",
		"	out_pkptr = op_pk_create(PIM_PRUNE_PK_SIZE);",
		"	op_ici_attr_set(net_ici_ptr,\"dest_net\",PIM_PRUNE);",
		"	op_ici_attr_set(net_ici_ptr,\"dest_node\",group_no);",
		"	op_ici_attr_set(net_ici_ptr,\"src_net\",net_num0);",
		"	op_ici_attr_set(net_ici_ptr,\"src_node\",node_num0);",
		"	op_ici_attr_set(net_ici_ptr, \"source\",source);",
		"	op_ici_attr_set(net_ici_ptr,\"RP_bit\",RP_bit);",
		"	op_ici_attr_set(net_ici_ptr,\"WC_bit\",WC_bit);",
		"	op_ici_install(net_ici_ptr);                   ",
		"	op_pk_send(out_pkptr,TO_IP_ENCAP);",
		"    }",
		"",
		"if( op_prg_odb_ltrace_active(\"pim_sm\") ",
		"	|| op_prg_odb_ltrace_active(\"nrl_all\")",
		"	|| op_prg_odb_ltrace_active(\"prune\") ",
		"	|| (op_prg_odb_ltrace_active(\"one_group\") && group_no == GROUP_TO_TRACE))",
		"		if (flag2)",
		"			printf(\"\\n%6.3f (%3d, %d) PIM_SM: PIM_PRUNE message generated for group %d.\",",
		"						op_sim_time(),net_num0,node_num0,group_no);",
		"		else",
		"			printf(\"\\n%6.3f (%3d, %d) PIM_SM: No additional PIM_PRUNE messages were generated.\",",
		"				op_sim_time(),net_num0,node_num0);",
		"",
		"",
		"",
		"op_pk_destroy(in_pkptr);",
		"",
		PRGC_NIL);

	/* create and init prg list 'prg_lptr [44]' */
	prg_lptr [44] = prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [41], 
		"name",                 COMP_CONTENTS, "PRUNE_RPENTRY",
		"enter execs",          COMP_CONTENTS, prg_lptr [43],
		"exit execs",           COMP_CONTENTS, prg_lptr [44],
		"status",               COMP_TOGGLE,   EMAC_ENABLED,
		"position",             COMP_CONTENTS, obj [42],
		"initial",              COMP_TOGGLE,   EMAC_DISABLED,
		EMAC_EOL);


	/* assign attrs for object 'obj [43]' */
	Ema_Object_Attr_Set (model_id, obj [43], 
		"name",                 COMP_CONTENTS, "tr_0",
		"condition",            COMP_CONTENTS, "",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [9],
		"src state",            COMP_CONTENTS, obj [7],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [44],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [45],
		"label pos",            COMP_CONTENTS, obj [46],
		EMAC_EOL);


	/* assign attrs for object 'obj [47]' */
	Ema_Object_Attr_Set (model_id, obj [47], 
		"name",                 COMP_CONTENTS, "tr_34",
		"condition",            COMP_CONTENTS, "FROM_NETWORK",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [11],
		"src state",            COMP_CONTENTS, obj [9],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [48],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [49],
		"path",                 COMP_ARRAY_CONTENTS (2), obj [50],
		"label pos",            COMP_CONTENTS, obj [51],
		EMAC_EOL);


	/* assign attrs for object 'obj [52]' */
	Ema_Object_Attr_Set (model_id, obj [52], 
		"name",                 COMP_CONTENTS, "tr_40",
		"condition",            COMP_CONTENTS, "",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [9],
		"src state",            COMP_CONTENTS, obj [13],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [53],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [54],
		"label pos",            COMP_CONTENTS, obj [55],
		EMAC_EOL);


	/* assign attrs for object 'obj [56]' */
	Ema_Object_Attr_Set (model_id, obj [56], 
		"name",                 COMP_CONTENTS, "tr_46",
		"condition",            COMP_CONTENTS, "",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [9],
		"src state",            COMP_CONTENTS, obj [15],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [57],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [58],
		"label pos",            COMP_CONTENTS, obj [59],
		EMAC_EOL);


	/* assign attrs for object 'obj [60]' */
	Ema_Object_Attr_Set (model_id, obj [60], 
		"name",                 COMP_CONTENTS, "tr_47",
		"condition",            COMP_CONTENTS, "",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [9],
		"src state",            COMP_CONTENTS, obj [17],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [61],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [62],
		"label pos",            COMP_CONTENTS, obj [63],
		EMAC_EOL);


	/* assign attrs for object 'obj [64]' */
	Ema_Object_Attr_Set (model_id, obj [64], 
		"name",                 COMP_CONTENTS, "tr_52",
		"condition",            COMP_CONTENTS, "FROM_IGMP",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [19],
		"src state",            COMP_CONTENTS, obj [9],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [65],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [66],
		"path",                 COMP_ARRAY_CONTENTS (2), obj [67],
		"label pos",            COMP_CONTENTS, obj [68],
		EMAC_EOL);


	/* assign attrs for object 'obj [69]' */
	Ema_Object_Attr_Set (model_id, obj [69], 
		"name",                 COMP_CONTENTS, "tr_53",
		"condition",            COMP_CONTENTS, "JOIN_SOURCE",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [13],
		"src state",            COMP_CONTENTS, obj [11],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [70],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [71],
		"label pos",            COMP_CONTENTS, obj [72],
		EMAC_EOL);


	/* assign attrs for object 'obj [73]' */
	Ema_Object_Attr_Set (model_id, obj [73], 
		"name",                 COMP_CONTENTS, "tr_54",
		"condition",            COMP_CONTENTS, "IGMP_JOIN",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [15],
		"src state",            COMP_CONTENTS, obj [19],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [74],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [75],
		"label pos",            COMP_CONTENTS, obj [76],
		EMAC_EOL);


	/* assign attrs for object 'obj [77]' */
	Ema_Object_Attr_Set (model_id, obj [77], 
		"name",                 COMP_CONTENTS, "tr_55",
		"condition",            COMP_CONTENTS, "IGMP_LEAVE",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [17],
		"src state",            COMP_CONTENTS, obj [19],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [78],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [79],
		"label pos",            COMP_CONTENTS, obj [80],
		EMAC_EOL);


	/* assign attrs for object 'obj [81]' */
	Ema_Object_Attr_Set (model_id, obj [81], 
		"name",                 COMP_CONTENTS, "tr_58",
		"condition",            COMP_CONTENTS, "NEW_GROUP",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [21],
		"src state",            COMP_CONTENTS, obj [11],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [82],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [83],
		"label pos",            COMP_CONTENTS, obj [84],
		EMAC_EOL);


	/* assign attrs for object 'obj [85]' */
	Ema_Object_Attr_Set (model_id, obj [85], 
		"name",                 COMP_CONTENTS, "tr_62",
		"condition",            COMP_CONTENTS, "PRUNE",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [23],
		"src state",            COMP_CONTENTS, obj [11],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [86],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [87],
		"label pos",            COMP_CONTENTS, obj [88],
		EMAC_EOL);


	/* assign attrs for object 'obj [89]' */
	Ema_Object_Attr_Set (model_id, obj [89], 
		"name",                 COMP_CONTENTS, "tr_63",
		"condition",            COMP_CONTENTS, "",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [9],
		"src state",            COMP_CONTENTS, obj [21],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [90],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [91],
		"label pos",            COMP_CONTENTS, obj [92],
		EMAC_EOL);


	/* assign attrs for object 'obj [93]' */
	Ema_Object_Attr_Set (model_id, obj [93], 
		"name",                 COMP_CONTENTS, "tr_64",
		"condition",            COMP_CONTENTS, "",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [9],
		"src state",            COMP_CONTENTS, obj [23],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [94],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [95],
		"label pos",            COMP_CONTENTS, obj [96],
		EMAC_EOL);


	/* assign attrs for object 'obj [97]' */
	Ema_Object_Attr_Set (model_id, obj [97], 
		"name",                 COMP_CONTENTS, "tr_65",
		"condition",            COMP_CONTENTS, "REGISTER",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [25],
		"src state",            COMP_CONTENTS, obj [11],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [98],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [99],
		"label pos",            COMP_CONTENTS, obj [100],
		EMAC_EOL);


	/* assign attrs for object 'obj [101]' */
	Ema_Object_Attr_Set (model_id, obj [101], 
		"name",                 COMP_CONTENTS, "tr_68",
		"condition",            COMP_CONTENTS, "",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [9],
		"src state",            COMP_CONTENTS, obj [25],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [102],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [103],
		"path",                 COMP_ARRAY_CONTENTS (2), obj [104],
		"label pos",            COMP_CONTENTS, obj [105],
		EMAC_EOL);


	/* assign attrs for object 'obj [106]' */
	Ema_Object_Attr_Set (model_id, obj [106], 
		"name",                 COMP_CONTENTS, "tr_70",
		"condition",            COMP_CONTENTS, "",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [9],
		"src state",            COMP_CONTENTS, obj [27],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [107],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [108],
		"path",                 COMP_ARRAY_CONTENTS (2), obj [109],
		"label pos",            COMP_CONTENTS, obj [110],
		EMAC_EOL);


	/* assign attrs for object 'obj [111]' */
	Ema_Object_Attr_Set (model_id, obj [111], 
		"name",                 COMP_CONTENTS, "tr_73",
		"condition",            COMP_CONTENTS, "SPT_SETUP",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [29],
		"src state",            COMP_CONTENTS, obj [11],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [112],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [113],
		"label pos",            COMP_CONTENTS, obj [114],
		EMAC_EOL);


	/* assign attrs for object 'obj [115]' */
	Ema_Object_Attr_Set (model_id, obj [115], 
		"name",                 COMP_CONTENTS, "tr_74",
		"condition",            COMP_CONTENTS, "",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [9],
		"src state",            COMP_CONTENTS, obj [29],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [116],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [117],
		"label pos",            COMP_CONTENTS, obj [118],
		EMAC_EOL);


	/* assign attrs for object 'obj [119]' */
	Ema_Object_Attr_Set (model_id, obj [119], 
		"name",                 COMP_CONTENTS, "tr_75",
		"condition",            COMP_CONTENTS, "TIMEOUT",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [31],
		"src state",            COMP_CONTENTS, obj [9],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [120],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [121],
		"label pos",            COMP_CONTENTS, obj [122],
		EMAC_EOL);


	/* assign attrs for object 'obj [123]' */
	Ema_Object_Attr_Set (model_id, obj [123], 
		"name",                 COMP_CONTENTS, "tr_76",
		"condition",            COMP_CONTENTS, "",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [9],
		"src state",            COMP_CONTENTS, obj [31],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [124],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [125],
		"label pos",            COMP_CONTENTS, obj [126],
		EMAC_EOL);


	/* assign attrs for object 'obj [127]' */
	Ema_Object_Attr_Set (model_id, obj [127], 
		"name",                 COMP_CONTENTS, "tr_77",
		"condition",            COMP_CONTENTS, "RP_REPORT",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [33],
		"src state",            COMP_CONTENTS, obj [11],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [128],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [129],
		"label pos",            COMP_CONTENTS, obj [130],
		EMAC_EOL);


	/* assign attrs for object 'obj [131]' */
	Ema_Object_Attr_Set (model_id, obj [131], 
		"name",                 COMP_CONTENTS, "tr_78",
		"condition",            COMP_CONTENTS, "",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [9],
		"src state",            COMP_CONTENTS, obj [33],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [132],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [133],
		"path",                 COMP_ARRAY_CONTENTS (2), obj [134],
		"label pos",            COMP_CONTENTS, obj [135],
		EMAC_EOL);


	/* assign attrs for object 'obj [136]' */
	Ema_Object_Attr_Set (model_id, obj [136], 
		"name",                 COMP_CONTENTS, "tr_79",
		"condition",            COMP_CONTENTS, "SEND_PIM_QUERY",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [35],
		"src state",            COMP_CONTENTS, obj [9],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [137],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [138],
		"label pos",            COMP_CONTENTS, obj [139],
		EMAC_EOL);


	/* assign attrs for object 'obj [140]' */
	Ema_Object_Attr_Set (model_id, obj [140], 
		"name",                 COMP_CONTENTS, "tr_80",
		"condition",            COMP_CONTENTS, "",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [9],
		"src state",            COMP_CONTENTS, obj [35],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [141],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [142],
		"label pos",            COMP_CONTENTS, obj [143],
		EMAC_EOL);


	/* assign attrs for object 'obj [144]' */
	Ema_Object_Attr_Set (model_id, obj [144], 
		"name",                 COMP_CONTENTS, "tr_83",
		"condition",            COMP_CONTENTS, "RCV_PIM_QUERY",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [37],
		"src state",            COMP_CONTENTS, obj [11],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [145],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [146],
		"label pos",            COMP_CONTENTS, obj [147],
		EMAC_EOL);


	/* assign attrs for object 'obj [148]' */
	Ema_Object_Attr_Set (model_id, obj [148], 
		"name",                 COMP_CONTENTS, "tr_84",
		"condition",            COMP_CONTENTS, "",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [9],
		"src state",            COMP_CONTENTS, obj [37],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [149],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [150],
		"path",                 COMP_ARRAY_CONTENTS (2), obj [151],
		"label pos",            COMP_CONTENTS, obj [152],
		EMAC_EOL);


	/* assign attrs for object 'obj [153]' */
	Ema_Object_Attr_Set (model_id, obj [153], 
		"name",                 COMP_CONTENTS, "tr_85",
		"condition",            COMP_CONTENTS, "JOIN_SHARED",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [39],
		"src state",            COMP_CONTENTS, obj [11],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [154],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [155],
		"label pos",            COMP_CONTENTS, obj [156],
		EMAC_EOL);


	/* assign attrs for object 'obj [157]' */
	Ema_Object_Attr_Set (model_id, obj [157], 
		"name",                 COMP_CONTENTS, "tr_86",
		"condition",            COMP_CONTENTS, "REGISTER_STOP",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [27],
		"src state",            COMP_CONTENTS, obj [11],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [158],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [159],
		"label pos",            COMP_CONTENTS, obj [160],
		EMAC_EOL);


	/* assign attrs for object 'obj [161]' */
	Ema_Object_Attr_Set (model_id, obj [161], 
		"name",                 COMP_CONTENTS, "tr_87",
		"condition",            COMP_CONTENTS, "",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [9],
		"src state",            COMP_CONTENTS, obj [39],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [162],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [163],
		"label pos",            COMP_CONTENTS, obj [164],
		EMAC_EOL);


	/* assign attrs for object 'obj [165]' */
	Ema_Object_Attr_Set (model_id, obj [165], 
		"name",                 COMP_CONTENTS, "tr_89",
		"condition",            COMP_CONTENTS, "PRUNE_RPENTRY",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [41],
		"src state",            COMP_CONTENTS, obj [11],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [166],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [167],
		"label pos",            COMP_CONTENTS, obj [168],
		EMAC_EOL);


	/* assign attrs for object 'obj [169]' */
	Ema_Object_Attr_Set (model_id, obj [169], 
		"name",                 COMP_CONTENTS, "tr_90",
		"condition",            COMP_CONTENTS, "",
		"executive",            COMP_CONTENTS, "",
		"dest state",           COMP_CONTENTS, obj [9],
		"src state",            COMP_CONTENTS, obj [41],
		"drawing style",        COMP_TOGGLE,   EMAC_ENABLED,
		"color",                COMP_CONTENTS, 63,
		"path",                 COMP_ARRAY_CONTENTS (0), obj [170],
		"path",                 COMP_ARRAY_CONTENTS (1), obj [171],
		"label pos",            COMP_CONTENTS, obj [172],
		EMAC_EOL);


	/* assign attrs for object 'obj [8]' */
	Ema_Object_Attr_Set (model_id, obj [8], 
		"x",                    COMP_CONTENTS, (double) 90,
		"y",                    COMP_CONTENTS, (double) 330,
		EMAC_EOL);


	/* assign attrs for object 'obj [10]' */
	Ema_Object_Attr_Set (model_id, obj [10], 
		"x",                    COMP_CONTENTS, (double) 270,
		"y",                    COMP_CONTENTS, (double) 210,
		EMAC_EOL);


	/* assign attrs for object 'obj [12]' */
	Ema_Object_Attr_Set (model_id, obj [12], 
		"x",                    COMP_CONTENTS, (double) 570,
		"y",                    COMP_CONTENTS, (double) 390,
		EMAC_EOL);


	/* assign attrs for object 'obj [14]' */
	Ema_Object_Attr_Set (model_id, obj [14], 
		"x",                    COMP_CONTENTS, (double) 450,
		"y",                    COMP_CONTENTS, (double) 270,
		EMAC_EOL);


	/* assign attrs for object 'obj [16]' */
	Ema_Object_Attr_Set (model_id, obj [16], 
		"x",                    COMP_CONTENTS, (double) 330,
		"y",                    COMP_CONTENTS, (double) 90,
		EMAC_EOL);


	/* assign attrs for object 'obj [18]' */
	Ema_Object_Attr_Set (model_id, obj [18], 
		"x",                    COMP_CONTENTS, (double) 270,
		"y",                    COMP_CONTENTS, (double) 30,
		EMAC_EOL);


	/* assign attrs for object 'obj [20]' */
	Ema_Object_Attr_Set (model_id, obj [20], 
		"x",                    COMP_CONTENTS, (double) 450,
		"y",                    COMP_CONTENTS, (double) 30,
		EMAC_EOL);


	/* assign attrs for object 'obj [22]' */
	Ema_Object_Attr_Set (model_id, obj [22], 
		"x",                    COMP_CONTENTS, (double) 510,
		"y",                    COMP_CONTENTS, (double) 210,
		EMAC_EOL);


	/* assign attrs for object 'obj [24]' */
	Ema_Object_Attr_Set (model_id, obj [24], 
		"x",                    COMP_CONTENTS, (double) 270,
		"y",                    COMP_CONTENTS, (double) 450,
		EMAC_EOL);


	/* assign attrs for object 'obj [26]' */
	Ema_Object_Attr_Set (model_id, obj [26], 
		"x",                    COMP_CONTENTS, (double) 330,
		"y",                    COMP_CONTENTS, (double) 510,
		EMAC_EOL);


	/* assign attrs for object 'obj [28]' */
	Ema_Object_Attr_Set (model_id, obj [28], 
		"x",                    COMP_CONTENTS, (double) 390,
		"y",                    COMP_CONTENTS, (double) 570,
		EMAC_EOL);


	/* assign attrs for object 'obj [30]' */
	Ema_Object_Attr_Set (model_id, obj [30], 
		"x",                    COMP_CONTENTS, (double) 570,
		"y",                    COMP_CONTENTS, (double) 150,
		EMAC_EOL);


	/* assign attrs for object 'obj [32]' */
	Ema_Object_Attr_Set (model_id, obj [32], 
		"x",                    COMP_CONTENTS, (double) 150,
		"y",                    COMP_CONTENTS, (double) 90,
		EMAC_EOL);


	/* assign attrs for object 'obj [34]' */
	Ema_Object_Attr_Set (model_id, obj [34], 
		"x",                    COMP_CONTENTS, (double) 630,
		"y",                    COMP_CONTENTS, (double) 210,
		EMAC_EOL);


	/* assign attrs for object 'obj [36]' */
	Ema_Object_Attr_Set (model_id, obj [36], 
		"x",                    COMP_CONTENTS, (double) 90,
		"y",                    COMP_CONTENTS, (double) 150,
		EMAC_EOL);


	/* assign attrs for object 'obj [38]' */
	Ema_Object_Attr_Set (model_id, obj [38], 
		"x",                    COMP_CONTENTS, (double) 690,
		"y",                    COMP_CONTENTS, (double) 270,
		EMAC_EOL);


	/* assign attrs for object 'obj [40]' */
	Ema_Object_Attr_Set (model_id, obj [40], 
		"x",                    COMP_CONTENTS, (double) 390,
		"y",                    COMP_CONTENTS, (double) 330,
		EMAC_EOL);


	/* assign attrs for object 'obj [42]' */
	Ema_Object_Attr_Set (model_id, obj [42], 
		"x",                    COMP_CONTENTS, (double) 330,
		"y",                    COMP_CONTENTS, (double) 390,
		EMAC_EOL);


	/* assign attrs for object 'obj [44]' */
	Ema_Object_Attr_Set (model_id, obj [44], 
		"x",                    COMP_CONTENTS, (double) 117,
		"y",                    COMP_CONTENTS, (double) 319,
		EMAC_EOL);


	/* assign attrs for object 'obj [45]' */
	Ema_Object_Attr_Set (model_id, obj [45], 
		"x",                    COMP_CONTENTS, (double) 243,
		"y",                    COMP_CONTENTS, (double) 219,
		EMAC_EOL);


	/* assign attrs for object 'obj [46]' */
	Ema_Object_Attr_Set (model_id, obj [46], 
		"x",                    COMP_CONTENTS, (double) 180,
		"y",                    COMP_CONTENTS, (double) 239,
		EMAC_EOL);


	/* assign attrs for object 'obj [48]' */
	Ema_Object_Attr_Set (model_id, obj [48], 
		"x",                    COMP_CONTENTS, (double) 294,
		"y",                    COMP_CONTENTS, (double) 224,
		EMAC_EOL);


	/* assign attrs for object 'obj [49]' */
	Ema_Object_Attr_Set (model_id, obj [49], 
		"x",                    COMP_CONTENTS, (double) 373,
		"y",                    COMP_CONTENTS, (double) 266,
		EMAC_EOL);


	/* assign attrs for object 'obj [50]' */
	Ema_Object_Attr_Set (model_id, obj [50], 
		"x",                    COMP_CONTENTS, (double) 546,
		"y",                    COMP_CONTENTS, (double) 374,
		EMAC_EOL);


	/* assign attrs for object 'obj [51]' */
	Ema_Object_Attr_Set (model_id, obj [51], 
		"x",                    COMP_CONTENTS, (double) 333,
		"y",                    COMP_CONTENTS, (double) 245,
		EMAC_EOL);


	/* assign attrs for object 'obj [53]' */
	Ema_Object_Attr_Set (model_id, obj [53], 
		"x",                    COMP_CONTENTS, (double) 424,
		"y",                    COMP_CONTENTS, (double) 257,
		EMAC_EOL);


	/* assign attrs for object 'obj [54]' */
	Ema_Object_Attr_Set (model_id, obj [54], 
		"x",                    COMP_CONTENTS, (double) 297,
		"y",                    COMP_CONTENTS, (double) 217,
		EMAC_EOL);


	/* assign attrs for object 'obj [55]' */
	Ema_Object_Attr_Set (model_id, obj [55], 
		"x",                    COMP_CONTENTS, (double) 360,
		"y",                    COMP_CONTENTS, (double) 237,
		EMAC_EOL);


	/* assign attrs for object 'obj [57]' */
	Ema_Object_Attr_Set (model_id, obj [57], 
		"x",                    COMP_CONTENTS, (double) 319,
		"y",                    COMP_CONTENTS, (double) 115,
		EMAC_EOL);


	/* assign attrs for object 'obj [58]' */
	Ema_Object_Attr_Set (model_id, obj [58], 
		"x",                    COMP_CONTENTS, (double) 283,
		"y",                    COMP_CONTENTS, (double) 184,
		EMAC_EOL);


	/* assign attrs for object 'obj [59]' */
	Ema_Object_Attr_Set (model_id, obj [59], 
		"x",                    COMP_CONTENTS, (double) 301,
		"y",                    COMP_CONTENTS, (double) 149,
		EMAC_EOL);


	/* assign attrs for object 'obj [61]' */
	Ema_Object_Attr_Set (model_id, obj [61], 
		"x",                    COMP_CONTENTS, (double) 272,
		"y",                    COMP_CONTENTS, (double) 57,
		EMAC_EOL);


	/* assign attrs for object 'obj [62]' */
	Ema_Object_Attr_Set (model_id, obj [62], 
		"x",                    COMP_CONTENTS, (double) 270,
		"y",                    COMP_CONTENTS, (double) 181,
		EMAC_EOL);


	/* assign attrs for object 'obj [63]' */
	Ema_Object_Attr_Set (model_id, obj [63], 
		"x",                    COMP_CONTENTS, (double) 271,
		"y",                    COMP_CONTENTS, (double) 119,
		EMAC_EOL);


	/* assign attrs for object 'obj [65]' */
	Ema_Object_Attr_Set (model_id, obj [65], 
		"x",                    COMP_CONTENTS, (double) 291,
		"y",                    COMP_CONTENTS, (double) 190,
		EMAC_EOL);


	/* assign attrs for object 'obj [66]' */
	Ema_Object_Attr_Set (model_id, obj [66], 
		"x",                    COMP_CONTENTS, (double) 413,
		"y",                    COMP_CONTENTS, (double) 103,
		EMAC_EOL);


	/* assign attrs for object 'obj [67]' */
	Ema_Object_Attr_Set (model_id, obj [67], 
		"x",                    COMP_CONTENTS, (double) 442,
		"y",                    COMP_CONTENTS, (double) 56,
		EMAC_EOL);


	/* assign attrs for object 'obj [68]' */
	Ema_Object_Attr_Set (model_id, obj [68], 
		"x",                    COMP_CONTENTS, (double) 352,
		"y",                    COMP_CONTENTS, (double) 146,
		EMAC_EOL);


	/* assign attrs for object 'obj [70]' */
	Ema_Object_Attr_Set (model_id, obj [70], 
		"x",                    COMP_CONTENTS, (double) 551,
		"y",                    COMP_CONTENTS, (double) 368,
		EMAC_EOL);


	/* assign attrs for object 'obj [71]' */
	Ema_Object_Attr_Set (model_id, obj [71], 
		"x",                    COMP_CONTENTS, (double) 471,
		"y",                    COMP_CONTENTS, (double) 288,
		EMAC_EOL);


	/* assign attrs for object 'obj [72]' */
	Ema_Object_Attr_Set (model_id, obj [72], 
		"x",                    COMP_CONTENTS, (double) 511,
		"y",                    COMP_CONTENTS, (double) 328,
		EMAC_EOL);


	/* assign attrs for object 'obj [74]' */
	Ema_Object_Attr_Set (model_id, obj [74], 
		"x",                    COMP_CONTENTS, (double) 426,
		"y",                    COMP_CONTENTS, (double) 44,
		EMAC_EOL);


	/* assign attrs for object 'obj [75]' */
	Ema_Object_Attr_Set (model_id, obj [75], 
		"x",                    COMP_CONTENTS, (double) 357,
		"y",                    COMP_CONTENTS, (double) 79,
		EMAC_EOL);


	/* assign attrs for object 'obj [76]' */
	Ema_Object_Attr_Set (model_id, obj [76], 
		"x",                    COMP_CONTENTS, (double) 391,
		"y",                    COMP_CONTENTS, (double) 61,
		EMAC_EOL);


	/* assign attrs for object 'obj [78]' */
	Ema_Object_Attr_Set (model_id, obj [78], 
		"x",                    COMP_CONTENTS, (double) 422,
		"y",                    COMP_CONTENTS, (double) 28,
		EMAC_EOL);


	/* assign attrs for object 'obj [79]' */
	Ema_Object_Attr_Set (model_id, obj [79], 
		"x",                    COMP_CONTENTS, (double) 298,
		"y",                    COMP_CONTENTS, (double) 28,
		EMAC_EOL);


	/* assign attrs for object 'obj [80]' */
	Ema_Object_Attr_Set (model_id, obj [80], 
		"x",                    COMP_CONTENTS, (double) 360,
		"y",                    COMP_CONTENTS, (double) 28,
		EMAC_EOL);


	/* assign attrs for object 'obj [82]' */
	Ema_Object_Attr_Set (model_id, obj [82], 
		"x",                    COMP_CONTENTS, (double) 563,
		"y",                    COMP_CONTENTS, (double) 361,
		EMAC_EOL);


	/* assign attrs for object 'obj [83]' */
	Ema_Object_Attr_Set (model_id, obj [83], 
		"x",                    COMP_CONTENTS, (double) 521,
		"y",                    COMP_CONTENTS, (double) 235,
		EMAC_EOL);


	/* assign attrs for object 'obj [84]' */
	Ema_Object_Attr_Set (model_id, obj [84], 
		"x",                    COMP_CONTENTS, (double) 542,
		"y",                    COMP_CONTENTS, (double) 298,
		EMAC_EOL);


	/* assign attrs for object 'obj [86]' */
	Ema_Object_Attr_Set (model_id, obj [86], 
		"x",                    COMP_CONTENTS, (double) 542,
		"y",                    COMP_CONTENTS, (double) 388,
		EMAC_EOL);


	/* assign attrs for object 'obj [87]' */
	Ema_Object_Attr_Set (model_id, obj [87], 
		"x",                    COMP_CONTENTS, (double) 297,
		"y",                    COMP_CONTENTS, (double) 440,
		EMAC_EOL);


	/* assign attrs for object 'obj [88]' */
	Ema_Object_Attr_Set (model_id, obj [88], 
		"x",                    COMP_CONTENTS, (double) 419,
		"y",                    COMP_CONTENTS, (double) 414,
		EMAC_EOL);


	/* assign attrs for object 'obj [90]' */
	Ema_Object_Attr_Set (model_id, obj [90], 
		"x",                    COMP_CONTENTS, (double) 482,
		"y",                    COMP_CONTENTS, (double) 202,
		EMAC_EOL);


	/* assign attrs for object 'obj [91]' */
	Ema_Object_Attr_Set (model_id, obj [91], 
		"x",                    COMP_CONTENTS, (double) 298,
		"y",                    COMP_CONTENTS, (double) 214,
		EMAC_EOL);


	/* assign attrs for object 'obj [92]' */
	Ema_Object_Attr_Set (model_id, obj [92], 
		"x",                    COMP_CONTENTS, (double) 420,
		"y",                    COMP_CONTENTS, (double) 238,
		EMAC_EOL);


	/* assign attrs for object 'obj [94]' */
	Ema_Object_Attr_Set (model_id, obj [94], 
		"x",                    COMP_CONTENTS, (double) 269,
		"y",                    COMP_CONTENTS, (double) 421,
		EMAC_EOL);


	/* assign attrs for object 'obj [95]' */
	Ema_Object_Attr_Set (model_id, obj [95], 
		"x",                    COMP_CONTENTS, (double) 269,
		"y",                    COMP_CONTENTS, (double) 237,
		EMAC_EOL);


	/* assign attrs for object 'obj [96]' */
	Ema_Object_Attr_Set (model_id, obj [96], 
		"x",                    COMP_CONTENTS, (double) 269,
		"y",                    COMP_CONTENTS, (double) 359,
		EMAC_EOL);


	/* assign attrs for object 'obj [98]' */
	Ema_Object_Attr_Set (model_id, obj [98], 
		"x",                    COMP_CONTENTS, (double) 543,
		"y",                    COMP_CONTENTS, (double) 399,
		EMAC_EOL);


	/* assign attrs for object 'obj [99]' */
	Ema_Object_Attr_Set (model_id, obj [99], 
		"x",                    COMP_CONTENTS, (double) 356,
		"y",                    COMP_CONTENTS, (double) 498,
		EMAC_EOL);


	/* assign attrs for object 'obj [100]' */
	Ema_Object_Attr_Set (model_id, obj [100], 
		"x",                    COMP_CONTENTS, (double) 449,
		"y",                    COMP_CONTENTS, (double) 448,
		EMAC_EOL);


	/* assign attrs for object 'obj [102]' */
	Ema_Object_Attr_Set (model_id, obj [102], 
		"x",                    COMP_CONTENTS, (double) 302,
		"y",                    COMP_CONTENTS, (double) 505,
		EMAC_EOL);


	/* assign attrs for object 'obj [103]' */
	Ema_Object_Attr_Set (model_id, obj [103], 
		"x",                    COMP_CONTENTS, (double) 227,
		"y",                    COMP_CONTENTS, (double) 466,
		EMAC_EOL);


	/* assign attrs for object 'obj [104]' */
	Ema_Object_Attr_Set (model_id, obj [104], 
		"x",                    COMP_CONTENTS, (double) 262,
		"y",                    COMP_CONTENTS, (double) 236,
		EMAC_EOL);


	/* assign attrs for object 'obj [105]' */
	Ema_Object_Attr_Set (model_id, obj [105], 
		"x",                    COMP_CONTENTS, (double) 264,
		"y",                    COMP_CONTENTS, (double) 485,
		EMAC_EOL);


	/* assign attrs for object 'obj [107]' */
	Ema_Object_Attr_Set (model_id, obj [107], 
		"x",                    COMP_CONTENTS, (double) 363,
		"y",                    COMP_CONTENTS, (double) 559,
		EMAC_EOL);


	/* assign attrs for object 'obj [108]' */
	Ema_Object_Attr_Set (model_id, obj [108], 
		"x",                    COMP_CONTENTS, (double) 198,
		"y",                    COMP_CONTENTS, (double) 487,
		EMAC_EOL);


	/* assign attrs for object 'obj [109]' */
	Ema_Object_Attr_Set (model_id, obj [109], 
		"x",                    COMP_CONTENTS, (double) 258,
		"y",                    COMP_CONTENTS, (double) 235,
		EMAC_EOL);


	/* assign attrs for object 'obj [110]' */
	Ema_Object_Attr_Set (model_id, obj [110], 
		"x",                    COMP_CONTENTS, (double) 280,
		"y",                    COMP_CONTENTS, (double) 523,
		EMAC_EOL);


	/* assign attrs for object 'obj [112]' */
	Ema_Object_Attr_Set (model_id, obj [112], 
		"x",                    COMP_CONTENTS, (double) 569,
		"y",                    COMP_CONTENTS, (double) 361,
		EMAC_EOL);


	/* assign attrs for object 'obj [113]' */
	Ema_Object_Attr_Set (model_id, obj [113], 
		"x",                    COMP_CONTENTS, (double) 570,
		"y",                    COMP_CONTENTS, (double) 177,
		EMAC_EOL);


	/* assign attrs for object 'obj [114]' */
	Ema_Object_Attr_Set (model_id, obj [114], 
		"x",                    COMP_CONTENTS, (double) 569,
		"y",                    COMP_CONTENTS, (double) 269,
		EMAC_EOL);


	/* assign attrs for object 'obj [116]' */
	Ema_Object_Attr_Set (model_id, obj [116], 
		"x",                    COMP_CONTENTS, (double) 542,
		"y",                    COMP_CONTENTS, (double) 149,
		EMAC_EOL);


	/* assign attrs for object 'obj [117]' */
	Ema_Object_Attr_Set (model_id, obj [117], 
		"x",                    COMP_CONTENTS, (double) 298,
		"y",                    COMP_CONTENTS, (double) 204,
		EMAC_EOL);


	/* assign attrs for object 'obj [118]' */
	Ema_Object_Attr_Set (model_id, obj [118], 
		"x",                    COMP_CONTENTS, (double) 420,
		"y",                    COMP_CONTENTS, (double) 176,
		EMAC_EOL);


	/* assign attrs for object 'obj [120]' */
	Ema_Object_Attr_Set (model_id, obj [120], 
		"x",                    COMP_CONTENTS, (double) 260,
		"y",                    COMP_CONTENTS, (double) 182,
		EMAC_EOL);


	/* assign attrs for object 'obj [121]' */
	Ema_Object_Attr_Set (model_id, obj [121], 
		"x",                    COMP_CONTENTS, (double) 167,
		"y",                    COMP_CONTENTS, (double) 112,
		EMAC_EOL);


	/* assign attrs for object 'obj [122]' */
	Ema_Object_Attr_Set (model_id, obj [122], 
		"x",                    COMP_CONTENTS, (double) 243,
		"y",                    COMP_CONTENTS, (double) 147,
		EMAC_EOL);


	/* assign attrs for object 'obj [124]' */
	Ema_Object_Attr_Set (model_id, obj [124], 
		"x",                    COMP_CONTENTS, (double) 158,
		"y",                    COMP_CONTENTS, (double) 116,
		EMAC_EOL);


	/* assign attrs for object 'obj [125]' */
	Ema_Object_Attr_Set (model_id, obj [125], 
		"x",                    COMP_CONTENTS, (double) 255,
		"y",                    COMP_CONTENTS, (double) 185,
		EMAC_EOL);


	/* assign attrs for object 'obj [126]' */
	Ema_Object_Attr_Set (model_id, obj [126], 
		"x",                    COMP_CONTENTS, (double) 236,
		"y",                    COMP_CONTENTS, (double) 150,
		EMAC_EOL);


	/* assign attrs for object 'obj [128]' */
	Ema_Object_Attr_Set (model_id, obj [128], 
		"x",                    COMP_CONTENTS, (double) 578,
		"y",                    COMP_CONTENTS, (double) 362,
		EMAC_EOL);


	/* assign attrs for object 'obj [129]' */
	Ema_Object_Attr_Set (model_id, obj [129], 
		"x",                    COMP_CONTENTS, (double) 620,
		"y",                    COMP_CONTENTS, (double) 236,
		EMAC_EOL);


	/* assign attrs for object 'obj [130]' */
	Ema_Object_Attr_Set (model_id, obj [130], 
		"x",                    COMP_CONTENTS, (double) 599,
		"y",                    COMP_CONTENTS, (double) 299,
		EMAC_EOL);


	/* assign attrs for object 'obj [132]' */
	Ema_Object_Attr_Set (model_id, obj [132], 
		"x",                    COMP_CONTENTS, (double) 628,
		"y",                    COMP_CONTENTS, (double) 181,
		EMAC_EOL);


	/* assign attrs for object 'obj [133]' */
	Ema_Object_Attr_Set (model_id, obj [133], 
		"x",                    COMP_CONTENTS, (double) 587,
		"y",                    COMP_CONTENTS, (double) 98,
		EMAC_EOL);


	/* assign attrs for object 'obj [134]' */
	Ema_Object_Attr_Set (model_id, obj [134], 
		"x",                    COMP_CONTENTS, (double) 297,
		"y",                    COMP_CONTENTS, (double) 201,
		EMAC_EOL);


	/* assign attrs for object 'obj [135]' */
	Ema_Object_Attr_Set (model_id, obj [135], 
		"x",                    COMP_CONTENTS, (double) 607,
		"y",                    COMP_CONTENTS, (double) 139,
		EMAC_EOL);


	/* assign attrs for object 'obj [137]' */
	Ema_Object_Attr_Set (model_id, obj [137], 
		"x",                    COMP_CONTENTS, (double) 245,
		"y",                    COMP_CONTENTS, (double) 196,
		EMAC_EOL);


	/* assign attrs for object 'obj [138]' */
	Ema_Object_Attr_Set (model_id, obj [138], 
		"x",                    COMP_CONTENTS, (double) 117,
		"y",                    COMP_CONTENTS, (double) 159,
		EMAC_EOL);


	/* assign attrs for object 'obj [139]' */
	Ema_Object_Attr_Set (model_id, obj [139], 
		"x",                    COMP_CONTENTS, (double) 181,
		"y",                    COMP_CONTENTS, (double) 177,
		EMAC_EOL);


	/* assign attrs for object 'obj [141]' */
	Ema_Object_Attr_Set (model_id, obj [141], 
		"x",                    COMP_CONTENTS, (double) 113,
		"y",                    COMP_CONTENTS, (double) 165,
		EMAC_EOL);


	/* assign attrs for object 'obj [142]' */
	Ema_Object_Attr_Set (model_id, obj [142], 
		"x",                    COMP_CONTENTS, (double) 242,
		"y",                    COMP_CONTENTS, (double) 203,
		EMAC_EOL);


	/* assign attrs for object 'obj [143]' */
	Ema_Object_Attr_Set (model_id, obj [143], 
		"x",                    COMP_CONTENTS, (double) 207,
		"y",                    COMP_CONTENTS, (double) 184,
		EMAC_EOL);


	/* assign attrs for object 'obj [145]' */
	Ema_Object_Attr_Set (model_id, obj [145], 
		"x",                    COMP_CONTENTS, (double) 591,
		"y",                    COMP_CONTENTS, (double) 370,
		EMAC_EOL);


	/* assign attrs for object 'obj [146]' */
	Ema_Object_Attr_Set (model_id, obj [146], 
		"x",                    COMP_CONTENTS, (double) 671,
		"y",                    COMP_CONTENTS, (double) 290,
		EMAC_EOL);


	/* assign attrs for object 'obj [147]' */
	Ema_Object_Attr_Set (model_id, obj [147], 
		"x",                    COMP_CONTENTS, (double) 631,
		"y",                    COMP_CONTENTS, (double) 330,
		EMAC_EOL);


	/* assign attrs for object 'obj [149]' */
	Ema_Object_Attr_Set (model_id, obj [149], 
		"x",                    COMP_CONTENTS, (double) 694,
		"y",                    COMP_CONTENTS, (double) 241,
		EMAC_EOL);


	/* assign attrs for object 'obj [150]' */
	Ema_Object_Attr_Set (model_id, obj [150], 
		"x",                    COMP_CONTENTS, (double) 653,
		"y",                    COMP_CONTENTS, (double) 75,
		EMAC_EOL);


	/* assign attrs for object 'obj [151]' */
	Ema_Object_Attr_Set (model_id, obj [151], 
		"x",                    COMP_CONTENTS, (double) 293,
		"y",                    COMP_CONTENTS, (double) 193,
		EMAC_EOL);


	/* assign attrs for object 'obj [152]' */
	Ema_Object_Attr_Set (model_id, obj [152], 
		"x",                    COMP_CONTENTS, (double) 673,
		"y",                    COMP_CONTENTS, (double) 158,
		EMAC_EOL);


	/* assign attrs for object 'obj [154]' */
	Ema_Object_Attr_Set (model_id, obj [154], 
		"x",                    COMP_CONTENTS, (double) 543,
		"y",                    COMP_CONTENTS, (double) 380,
		EMAC_EOL);


	/* assign attrs for object 'obj [155]' */
	Ema_Object_Attr_Set (model_id, obj [155], 
		"x",                    COMP_CONTENTS, (double) 416,
		"y",                    COMP_CONTENTS, (double) 340,
		EMAC_EOL);


	/* assign attrs for object 'obj [156]' */
	Ema_Object_Attr_Set (model_id, obj [156], 
		"x",                    COMP_CONTENTS, (double) 479,
		"y",                    COMP_CONTENTS, (double) 360,
		EMAC_EOL);


	/* assign attrs for object 'obj [158]' */
	Ema_Object_Attr_Set (model_id, obj [158], 
		"x",                    COMP_CONTENTS, (double) 550,
		"y",                    COMP_CONTENTS, (double) 409,
		EMAC_EOL);


	/* assign attrs for object 'obj [159]' */
	Ema_Object_Attr_Set (model_id, obj [159], 
		"x",                    COMP_CONTENTS, (double) 413,
		"y",                    COMP_CONTENTS, (double) 553,
		EMAC_EOL);


	/* assign attrs for object 'obj [160]' */
	Ema_Object_Attr_Set (model_id, obj [160], 
		"x",                    COMP_CONTENTS, (double) 481,
		"y",                    COMP_CONTENTS, (double) 481,
		EMAC_EOL);


	/* assign attrs for object 'obj [162]' */
	Ema_Object_Attr_Set (model_id, obj [162], 
		"x",                    COMP_CONTENTS, (double) 372,
		"y",                    COMP_CONTENTS, (double) 307,
		EMAC_EOL);


	/* assign attrs for object 'obj [163]' */
	Ema_Object_Attr_Set (model_id, obj [163], 
		"x",                    COMP_CONTENTS, (double) 292,
		"y",                    COMP_CONTENTS, (double) 227,
		EMAC_EOL);


	/* assign attrs for object 'obj [164]' */
	Ema_Object_Attr_Set (model_id, obj [164], 
		"x",                    COMP_CONTENTS, (double) 332,
		"y",                    COMP_CONTENTS, (double) 267,
		EMAC_EOL);


	/* assign attrs for object 'obj [166]' */
	Ema_Object_Attr_Set (model_id, obj [166], 
		"x",                    COMP_CONTENTS, (double) 542,
		"y",                    COMP_CONTENTS, (double) 383,
		EMAC_EOL);


	/* assign attrs for object 'obj [167]' */
	Ema_Object_Attr_Set (model_id, obj [167], 
		"x",                    COMP_CONTENTS, (double) 358,
		"y",                    COMP_CONTENTS, (double) 391,
		EMAC_EOL);


	/* assign attrs for object 'obj [168]' */
	Ema_Object_Attr_Set (model_id, obj [168], 
		"x",                    COMP_CONTENTS, (double) 450,
		"y",                    COMP_CONTENTS, (double) 387,
		EMAC_EOL);


	/* assign attrs for object 'obj [170]' */
	Ema_Object_Attr_Set (model_id, obj [170], 
		"x",                    COMP_CONTENTS, (double) 320,
		"y",                    COMP_CONTENTS, (double) 362,
		EMAC_EOL);


	/* assign attrs for object 'obj [171]' */
	Ema_Object_Attr_Set (model_id, obj [171], 
		"x",                    COMP_CONTENTS, (double) 282,
		"y",                    COMP_CONTENTS, (double) 235,
		EMAC_EOL);


	/* assign attrs for object 'obj [172]' */
	Ema_Object_Attr_Set (model_id, obj [172], 
		"x",                    COMP_CONTENTS, (double) 301,
		"y",                    COMP_CONTENTS, (double) 298,
		EMAC_EOL);


	/* assign attrs for object 'obj [0]' */
	Ema_Object_Attr_Set (model_id, obj [0], 
		"name",                 COMP_CONTENTS, "begsim intrpt",
		"operation",            COMP_CONTENTS, 2,
		"value",                COMP_CONTENTS_TYPE, EMAC_TOGGLE,
		"value",                COMP_TOGGLE,   EMAC_DISABLED,
		"value",                COMP_INTENDED, EMAC_DISABLED,
		"type",                 COMP_CONTENTS, 2,
		EMAC_EOL);


	/* assign attrs for object 'obj [1]' */
	Ema_Object_Attr_Set (model_id, obj [1], 
		"name",                 COMP_CONTENTS, "endsim intrpt",
		"operation",            COMP_CONTENTS, 2,
		"value",                COMP_CONTENTS_TYPE, EMAC_TOGGLE,
		"value",                COMP_TOGGLE,   EMAC_DISABLED,
		"value",                COMP_INTENDED, EMAC_DISABLED,
		"type",                 COMP_CONTENTS, 2,
		EMAC_EOL);


	/* assign attrs for object 'obj [2]' */
	Ema_Object_Attr_Set (model_id, obj [2], 
		"name",                 COMP_CONTENTS, "failure intrpts",
		"operation",            COMP_CONTENTS, 2,
		"value",                COMP_CONTENTS_TYPE, EMAC_STRING,
		"value",                COMP_CONTENTS, "disabled",
		"value",                COMP_INTENDED, EMAC_DISABLED,
		"type",                 COMP_CONTENTS, 8,
		EMAC_EOL);


	/* assign attrs for object 'obj [3]' */
	Ema_Object_Attr_Set (model_id, obj [3], 
		"name",                 COMP_CONTENTS, "intrpt interval",
		"operation",            COMP_CONTENTS, 2,
		"value",                COMP_CONTENTS_TYPE, EMAC_DOUBLE,
		"value",                COMP_CONTENTS, (double) -1e+100,
		"value",                COMP_INTENDED, EMAC_DISABLED,
		"type",                 COMP_CONTENTS, 3,
		EMAC_EOL);


	/* assign attrs for object 'obj [4]' */
	Ema_Object_Attr_Set (model_id, obj [4], 
		"name",                 COMP_CONTENTS, "priority",
		"operation",            COMP_CONTENTS, 2,
		"value",                COMP_CONTENTS_TYPE, EMAC_INTEGER,
		"value",                COMP_CONTENTS, 0,
		"value",                COMP_INTENDED, EMAC_DISABLED,
		"type",                 COMP_CONTENTS, 0,
		EMAC_EOL);


	/* assign attrs for object 'obj [5]' */
	Ema_Object_Attr_Set (model_id, obj [5], 
		"name",                 COMP_CONTENTS, "recovery intrpts",
		"operation",            COMP_CONTENTS, 2,
		"value",                COMP_CONTENTS_TYPE, EMAC_STRING,
		"value",                COMP_CONTENTS, "disabled",
		"value",                COMP_INTENDED, EMAC_DISABLED,
		"type",                 COMP_CONTENTS, 8,
		EMAC_EOL);


	/* assign attrs for object 'obj [6]' */
	Ema_Object_Attr_Set (model_id, obj [6], 
		"name",                 COMP_CONTENTS, "super priority",
		"operation",            COMP_CONTENTS, 2,
		"value",                COMP_CONTENTS_TYPE, EMAC_TOGGLE,
		"value",                COMP_TOGGLE,   EMAC_DISABLED,
		"value",                COMP_INTENDED, EMAC_DISABLED,
		"type",                 COMP_CONTENTS, 2,
		EMAC_EOL);


	/* assign attrs for object 'obj [173]' */
	/* create and init prg list 'prg_lptr [45]' */
	prg_lptr [45] = prg_list_create ();
	Ema_Object_Attr_Set (model_id, obj [173], 
		"name",                 COMP_CONTENTS, "outstat",
		"count",                COMP_TOGGLE,   EMAC_ENABLED,
		"count",                COMP_CONTENTS, 100,
		"description",          COMP_CONTENTS, prg_lptr [45],
		EMAC_EOL);








	/* write the model to application-readable form */
	Ema_Model_Write (model_id, "pim_sm");

	}

