digraph finite_state_machine 
{

//	A4	: 210 x 297  mm
//		  8.3 x 11.7 inches

	size="8.3,11.7";
	rotate=90;

//	rankdir=state;

	node [shape = doublecircle]; state_empty;
	node [shape = none        ]; state_none;
	node [shape = circle      ]; 

	state_none			[ label = "" ];
	state_empty			[ label = "EMPTY" ];
	state_branch_wait_end		[ label = "BRANCH_WAIT_END" ];
	state_branch_complete		[ label = "BRANCH_COMPLETE" ];
	state_store_wait_head_ok	[ label = "STORE_WAIT_HEAD_OK" ];
	state_store_head_ok		[ label = "STORE_HEAD_OK" ];
	state_store_head_ko		[ label = "STORE_HEAD_KO" ];
	state_other_wait_end		[ label = "OTHER_WAIT_END" ];
	state_miss_wait_end		[ label = "MISS_WAIT_END" ];
	state_end_miss			[ label = "END_MISS" ];
	state_end_ok_speculative	[ label = "END_OK_SPECULATIVE" ];
	state_end_ok			[ label = "END_OK" ];
	state_end_ko_speculative	[ label = "END_KO_SPECULATIVE" ];
	state_end_ko			[ label = "END_KO" ];	       
	state_end_exception_wait_head   [ label = "END_EXCEPTION_WAIT_HEAD"   ];
	state_end_exception		[ label = "END_EXCEPTION" ];	

	state_none 			->	state_empty				[ label = "  /NRESET" ];

	state_empty			->	state_empty				[ label = "  /INSERT" ];
	state_empty			->	state_branch_wait_end			[ label = "  INSERT and /EXCEPTION and TYPE_BRANCH" ];
	state_empty			->	state_store_wait_head_ok		[ label = "  INSERT and /EXCEPTION and TYPE_STORE" ];
	state_empty			->	state_other_wait_end			[ label = "  INSERT and /EXCEPTION and TYPE_OTHER" ];
	state_empty			->	state_end_exception_wait_head		[ label = "  INSERT and EXCEPTION" ];
										
	state_branch_wait_end		->	state_branch_wait_end			[ label = "  /PREVIOUS_MISS_SPECULATION and /COMMIT" ];
	state_branch_wait_end		->	state_branch_complete		 	[ label = "  /PREVIOUS_MISS_SPECULATION and COMMIT and /EXCEPTION" ];
	state_branch_wait_end		->	state_end_exception_wait_head		[ label = "  /PREVIOUS_MISS_SPECULATION and COMMIT and EXCEPTION" ];
	state_branch_wait_end		->	state_miss_wait_end			[ label = "  PREVIOUS_MISS_SPECULATION" ];

	state_branch_complete		->	state_branch_complete			[ label = "  /PREVIOUS_MISS_SPECULATION and /BRANCH_COMPLETE" ];
	state_branch_complete		->	state_end_ok_speculative		[ label = "  /PREVIOUS_MISS_SPECULATION and BRANCH_COMPLETE" ];
	state_branch_complete		->	state_end_miss				[ label = "  PREVIOUS_MISS_SPECULATION" ];

	state_store_wait_head_ok	->	state_store_wait_head_ok		[ label = "  /PREVIOUS_MISS_SPECULATION and /HEAD" ];
	state_store_wait_head_ok	->	state_store_head_ok			[ label = "  /PREVIOUS_MISS_SPECULATION and HEAD" ];
	state_store_wait_head_ok	->	state_store_head_ko			[ label = "  PREVIOUS_MISS_SPECULATION" ];

	state_store_head_ok		->	state_store_head_ok			[ label = "  /REEXECUTE" ];
	state_store_head_ok		->	state_other_wait_end    		[ label = "  REEXECUTE" ];

	state_store_head_ko		->	state_store_head_ko			[ label = "  /REEXECUTE" ];
	state_store_head_ko		->	state_miss_wait_end		    	[ label = "  REEXECUTE" ];
										
	state_other_wait_end		->	state_other_wait_end			[ label = "  /PREVIOUS_MISS_SPECULATION and /COMMIT" ];
	state_other_wait_end		->	state_end_ok_speculative		[ label = "  /PREVIOUS_MISS_SPECULATION and COMMIT and /EXCEPTION" ];
	state_other_wait_end		->	state_end_exception_wait_head		[ label = "  /PREVIOUS_MISS_SPECULATION and COMMIT and EXCEPTION" ];
	state_other_wait_end		->	state_miss_wait_end			[ label = "  PREVIOUS_MISS_SPECULATION" ];

	state_miss_wait_end		->	state_miss_wait_end			[ label = "  /COMMIT" ];
	state_miss_wait_end		->	state_end_miss				[ label = "  COMMIT" ];

	state_end_miss			->	state_end_miss				[ label = "  /RETIRE" ];
	state_end_miss			->	state_empty				[ label = "  RETIRE" ];

	state_end_ok_speculative	->	state_end_ok_speculative		[ label = "  /PREVIOUS_MISS_SPECULATION and SPECULATIVE" ];
	state_end_ok_speculative	->	state_end_ok			 	[ label = "  /PREVIOUS_MISS_SPECULATION and /SPECULATIVE" ];
	state_end_ok_speculative	->	state_end_miss				[ label = "  PREVIOUS_MISS_SPECULATION" ];
									
	state_end_ok			->	state_end_ok				[ label = "  /RETIRE" ];
	state_end_ok			->	state_empty				[ label = "  RETIRE" ];

	state_end_ko_speculative	->	state_end_ko_speculative		[ label = "  /PREVIOUS_MISS_SPECULATION and SPECULATIVE" ];
	state_end_ko_speculative	->	state_end_ko 				[ label = "  /PREVIOUS_MISS_SPECULATION and /SPECULATIVE" ];
	state_end_ko_speculative	->	state_end_miss				[ label = "  PREVIOUS_MISS_SPECULATION" ];
										
	state_end_ko			->	state_end_ko				[ label = "  /RETIRE" ];
	state_end_ko			->	state_empty				[ label = "  RETIRE" ];
					
	state_end_exception_wait_head	->	state_end_exception_wait_head		[ label = "  /PREVIOUS_MISS_SPECULATION and /HEAD" ];
	state_end_exception_wait_head	->	state_end_exception		 	[ label = "  /PREVIOUS_MISS_SPECULATION and HEAD" ];
	state_end_exception_wait_head	->	state_end_miss				[ label = "  PREVIOUS_MISS_SPECULATION" ];
										
	state_end_exception		->	state_end_exception			[ label = "  /EVENT" ];
	state_end_exception		->	state_end_ko				[ label = "  EVENT" ];
}
