/*
 *
 * (C) COPYRIGHT 2010 ARM Limited. All rights reserved.
 *
 * This program is free software and is provided to you under the terms of the
 * GNU General Public License version 2 as published by the Free Software
 * Foundation, and any use by you of this program is subject to the terms
 * of such GNU licence.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can access it online at
 * http://www.gnu.org/licenses/gpl-2.0.html.
 *
 * SPDX-License-Identifier: GPL-2.0
 *
 */



digraph policy_objects_diagram {
	rankdir=LR;
	size="12,8";
	compound=true;

	node [ shape = box ];

	subgraph cluster_policy_queues {
		low_queue [ shape=record label = "LowP | {<ql>ctx_lo | ... | <qm>ctx_i | ... | <qr>ctx_hi}" ];
		queues_middle_sep [ label="" shape=plaintext width=0 height=0 ];

		rt_queue [ shape=record label = "RT | {<ql>ctx_lo | ... | <qm>ctx_j | ... | <qr>ctx_hi}" ];

		label = "Policy's Queue(s)";
	}

	call_enqueue [ shape=plaintext label="enqueue_ctx()" ];

	{
		rank=same;
		ordering=out;
		call_dequeue [ shape=plaintext label="dequeue_head_ctx()\n+ runpool_add_ctx()" ];
		call_ctxfinish [ shape=plaintext label="runpool_remove_ctx()" ];

		call_ctxdone [ shape=plaintext label="don't requeue;\n/* ctx has no more jobs */" ];
	}

	subgraph cluster_runpool {

		as0 [ width=2 height = 0.25 label="AS0: Job_1, ..., Job_n" ];
		as1 [ width=2 height = 0.25 label="AS1: Job_1, ..., Job_m" ];
		as2 [ width=2 height = 0.25 label="AS2: Job_1, ..., Job_p" ];
		as3 [ width=2 height = 0.25 label="AS3: Job_1, ..., Job_q" ];

		label = "Policy's Run Pool";
	}

	{
		rank=same;
		call_jdequeue [ shape=plaintext label="dequeue_job()" ];
		sstop_dotfixup [ shape=plaintext label="" width=0 height=0 ];
	}

	{
		rank=same;
		ordering=out;
		sstop [ shape=ellipse label="SS-Timer expires" ]
		jobslots [ shape=record label="Jobslots: | <0>js[0] | <1>js[1] | <2>js[2]" ];

		irq [ label="IRQ" shape=ellipse ];

		job_finish [ shape=plaintext label="don't requeue;\n/* job done */" ];
	}

	hstop [ shape=ellipse label="HS-Timer expires" ]

	/*
	 * Edges
	 */

	call_enqueue -> queues_middle_sep [ lhead=cluster_policy_queues ];

	low_queue:qr -> call_dequeue:w;
	rt_queue:qr -> call_dequeue:w;

	call_dequeue -> as1 [lhead=cluster_runpool];

	as1->call_jdequeue         [ltail=cluster_runpool];
	call_jdequeue->jobslots:0;
	call_jdequeue->sstop_dotfixup [ arrowhead=none];
	sstop_dotfixup->sstop      [label="Spawn SS-Timer"];
	sstop->jobslots            [label="SoftStop"];
	sstop->hstop               [label="Spawn HS-Timer"];
	hstop->jobslots:ne            [label="HardStop"];


	as3->call_ctxfinish:ne [ ltail=cluster_runpool ];
	call_ctxfinish:sw->rt_queue:qm [ lhead=cluster_policy_queues label="enqueue_ctx()\n/* ctx still has jobs */" ];

	call_ctxfinish->call_ctxdone [constraint=false];

	call_ctxdone->call_enqueue [weight=0.1 labeldistance=20.0 labelangle=0.0 taillabel="Job submitted to the ctx" style=dotted constraint=false];


	{
	jobslots->irq   [constraint=false];

	irq->job_finish [constraint=false];
	}

	irq->as2  [lhead=cluster_runpool label="requeue_job()\n/* timeslice expired */" ];

}
