ITANUPartitioningScheme.cpp 2.53 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
#include "ITANUPartitioningScheme.h"

#include <cassert>
#include <ITAASCIITable.h>
#include <sstream>

NUPartition::NUPartition( const std::vector<int>& vParts )
{
	iLength = iNumSegments = 0;
	int nParts = ( int ) vParts.size();
	if( nParts == 0 ) return;

	int k = 0; // Lnge des vorhergehenden Teiles
	for( int i = 0; i < nParts; i++ ) {
		// Im ersten Durchgang nur die Stufen zhlen:
		if( vParts[ i ] != k ) {
			k = vParts[ i ];
			iNumSegments++;
		}
	}

	voSegments.resize( iNumSegments );

	// --= Segmente zusammenstellen =--

	k = 0;
	int s = 0;			// Segmentzhler
	int b = vParts[ 0 ];	// Teillnge

	for( int i = 0; i < nParts; i++ ) {
		assert( vParts[ i ] > 0 );

		if( vParts[ i ] != k ) {
			k = vParts[ i ];

			// TODO: ber UPartition Konstruktor regeln
			// Informationen speichern
			voSegments[ s ].iOffset = iLength;
			voSegments[ s ].iPartLength = k;
			voSegments[ s ].iMultiplicity = 1;
			voSegments[ s ].iLength = voSegments[ s ].iPartLength*voSegments[ s ].iMultiplicity;
			voSegments[ s ].iLevel = s;

			/* Zyklusnummer (Hauptzeitzhler) indem soviele Eingabedaten
			   bereitstehen, wie die Teillnge der Stufe ist.
			   Hier kann die Berechnung der Stufe starten.
			   Hinweis: Im n-ten Takt stehen n+1 Blocklngen Eingabedaten bereit!
			   */
			int tReady = ( k / b ) - 1;

			/* Zyklusnummer (Hauptzeitzhler) indem die Berechnung der Stufe
			   abgeschlossen werden muss (Deadline) */
			int tDeadline = ( iLength <= b ? 0 : ( iLength / b ) - 1 );

			voSegments[ s ].iClearance = tDeadline - tReady;
			assert( voSegments[ s ].iClearance >= 0 );
			s++;
		}
		else {
			// Vielfachheit inkrementieren
			voSegments[ s - 1 ].iMultiplicity++;
			voSegments[ s - 1 ].iLength = voSegments[ s - 1 ].iPartLength*voSegments[ s - 1 ].iMultiplicity;
		}

		iLength += vParts[ i ];
	}
}

std::string NUPartition::ToString() const {
	if( iNumSegments == 0 ) return "Empty partition scheme of length 0";

	ITAASCIITable t( iNumSegments, 5 );
	t.setColumnTitle( 0, "Stage" );
	t.setColumnTitle( 1, "Partlength" );
	t.setColumnTitle( 2, "Multiplicity" );
	t.setColumnTitle( 3, "Offset" );
	t.setColumnTitle( 4, "Clearance" );

	for( int i = 0; i < iNumSegments; i++ ) {
		t.setContent( i, 0, i );
		t.setContent( i, 1, voSegments[ i ].iPartLength );
		t.setContent( i, 2, voSegments[ i ].iMultiplicity );
		t.setContent( i, 3, voSegments[ i ].iOffset );
		t.setContent( i, 4, voSegments[ i ].iClearance );
	}

	std::stringstream ss;
	ss << "Filter partition of length " << iLength << std::endl << std::endl
		<< t.toString() << std::endl;
	return ss.str();
}