/* * SYNOPSYS CONFIDENTIAL - This is an unpublished, proprietary work of Synopsys, * Inc., and is fully protected under copyright and trade secret laws. You may * not view, use, disclose, copy, or distribute this file or any information * contained herein except pursuant to a valid written license from Synopsys. */ #include #include #include "../getCurrentTime2.h" #include #include #include "transform2.h" #ifdef WIN32 #include #endif // // Forward declarations. // void print_result( double, double ); #define SCALE 100 //////////////////////////////////////////////////////////////////////////// // // The sample transformations. // struct tsmpl_s { double xloc; double yloc; double mag; double rot; bool flip; } tsmpl[] = { {0,0,1,0,0}, {0,0,1,90,0}, {0,0,1,180,0}, {0,0,1,270,0}, {0,0,1,0,1}, {0,0,1,90,1}, {0,0,1,180,1}, {0,0,1,270,1}, {1000,1000,1,0,0}, {1000,1000,1,90,0}, {1000,1000,1,180,0}, {1000,1000,1,270,0}, {1000,1000,1,0,1}, {1000,1000,1,90,1}, {1000,1000,1,180,1}, {1000,1000,1,270,1}, {1000,1000,10,0,0}, {1000,1000,10,90,0}, {1000,1000,10,180,0}, {1000,1000,10,270,0}, {1000,1000,10,0,1}, {1000,1000,10,90,1}, {1000,1000,10,180,1}, {1000,1000,10,270,1}, {1000,1000,10,0+45,0}, {1000,1000,10,90+45,0}, {1000,1000,10,180+45,0}, {1000,1000,10,270+45,0}, {1000,1000,10,0+45,1}, {1000,1000,10,90+45,1}, {1000,1000,10,180+45,1}, {1000,1000,10,270+45,1}, {1000,1000,10,0+30,0}, {1000,1000,10,90+30,1}, {1000,1000,10,0+60,0}, {1000,1000,10,90+60,1}, {1000,1000,10,123,1}, {1000,1000,10,321,1}, {1000,1000,10,17,1}, {1000,1000,10,71,1}, {1000,1000,1,360,0}, {0,0,1,0,0} }; #define tsmpl_count (sizeof(tsmpl)/sizeof(tsmpl_s)) template T mktrans( int i ) { assert( i < tsmpl_count ); return T( tsmpl[i].xloc, tsmpl[i].yloc, tsmpl[i].flip != 0, tsmpl[i].rot, tsmpl[i].mag ); } //////////////////////////////////////////////////////////////////////////// // // The sample rectangles. // struct rsmpl_s { double l; double b; double r; double t; } rsmpl[] = { {10000,10000,100000,100000}, {1000,1000,1000,1000}, {0,0,1000,1000} }; #define rsmpl_count (sizeof(rsmpl)/sizeof(rsmpl_s)) template pod::rectangle mkrect( int i ) { assert( i < rsmpl_count ); return pod::rectangle( C(rsmpl[i].l), C(rsmpl[i].b), C(rsmpl[i].r), C(rsmpl[i].t) ); } //////////////////////////////////////////////////////////////////////////// // // The sample points. // struct psmpl_s { double x; double y; } psmpl[] = { {100000,100000}, {10000,10000}, {1000,1000}, {1,1}, {0,0} }; #define psmpl_count (sizeof(psmpl)/sizeof(psmpl_s)) template pod::point mkpt( int i ) { assert( i < psmpl_count ); return pod::point( C(psmpl[i].x), C(psmpl[i].y) ); } //////////////////////////////////////////////////////////////////////////// // // log. // std::ofstream out; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// template< class T, class P, int nProbs > class modify { T trns; P src; P dest; public: modify( const T& t, const P& p ) { trns = t; src = p; } __forceinline void operator() () { for( int i = nProbs; i; --i ) trns.modify( src, dest ); } }; template< class T, class P, int nProbs > class modify2 { T trns; P src; public: modify2( const T& t, const P& p ) { trns = t; src = p; } __forceinline void operator() () { for( int i = nProbs; i; --i ) { volatile P p = trns.modify( src ); } } }; template< class P, int nProbes > void test( const base::transform& t1, const base2::transform& t2, const P& p ) { const int n = SCALE; typedef modify modify1_type; double dblMin1 = mesure( modify1_type( t1, p ), nProbes ); dblMin1 /= n; typedef modify modify2_type; double dblMin2 = mesure( modify2_type( t2, p ), nProbes ); dblMin2 /= n; typedef modify2 modify21_type; double dblMin21 = mesure( modify21_type( t1, p ), nProbes ); dblMin21 /= n; typedef modify2 modify22_type; double dblMin22 = mesure( modify22_type( t2, p ), nProbes ); dblMin22 /= n; print_result( dblMin1, dblMin2 ); print_result( dblMin21, dblMin22 ); } template< class P, int nProbes > void testTrans( int i, const P& p ) { out << ""; #if 0 out << "rot:" << tsmpl[i].rot << " flip:" << tsmpl[i].flip << " mag:" << tsmpl[i].mag << " x:" << tsmpl[i].xloc << " y:" << tsmpl[i].yloc << ""; #endif test(mktrans(i), mktrans(i), p); out << "" << std::endl; } template< class P, int nProbes > void testAllTrans( const P& p ) { for ( int i = 0; i < tsmpl_count; ++i ) testTrans(i,p); } template< class C, int nProbes > void testAllPt() { for ( int i = 0; i < psmpl_count; ++i ) testAllTrans,nProbes>(mkpt(i)); } template< class C, int nProbes > void testAllRect() { for ( int i = 0; i < rsmpl_count; ++i ) testAllTrans,nProbes>(mkrect(i)); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// template< class T, int nProbs > class mult { T trns; T trns2; T trns3; public: mult( const T& t, const T& t2 ) { trns = t; trns2 = t2; } __forceinline void operator() () { for( int i = nProbs; i; --i ) trns.mult( trns2, trns3 ); } }; template< class T, int nProbs > class mult2 { T trns; T trns2; public: mult2( const T& t, const T& t2 ) { trns = t; trns2 = t2; } __forceinline void operator() () { for( int i = nProbs; i; --i ) { volatile T t = trns * trns2; } } }; template< int nProbes > void testMult( const base::transform& t11, const base::transform& t12, const base2::transform& t21, const base2::transform& t22 ) { const int n = SCALE; { typedef mult mult1_type; double dblMin1 = mesure( mult1_type( t11, t12 ), nProbes ); dblMin1 /= n; typedef mult mult2_type; double dblMin2 = mesure( mult2_type( t21, t22 ), nProbes ); dblMin2 /= n; print_result( dblMin1, dblMin2 ); } { typedef mult2 mult1_type; double dblMin1 = mesure( mult1_type( t11, t12 ), nProbes ); dblMin1 /= n; typedef mult2 mult2_type; double dblMin2 = mesure( mult2_type( t21, t22 ), nProbes ); dblMin2 /= n; print_result( dblMin1, dblMin2 ); } } template< int nProbes > void testTrans1x1( int i, int j ) { out << ""; #if 0 out << "rot:" << tsmpl[i].rot << " flip:" << tsmpl[i].flip << " mag:" << tsmpl[i].mag << " x:" << tsmpl[i].xloc << " y:" << tsmpl[i].yloc << ""; out << "rot:" << tsmpl[j].rot << " flip:" << tsmpl[j].flip << " mag:" << tsmpl[j].mag << " x:" << tsmpl[j].xloc << " y:" << tsmpl[j].yloc << ""; #endif testMult(mktrans(i), mktrans(j), mktrans(i), mktrans(j) ); out << "" << std::endl; } template< int nProbes > void testAllTrans1x1() { for ( int i = 0; i < tsmpl_count; ++i ) for ( int j = 0; j < tsmpl_count; ++j ) testTrans1x1(i,j); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// template< class T, int nProbs > class inverse { T trns; T trns2; public: inverse( const T& t ) { trns = t; } __forceinline void operator() () { for( int i = nProbs; i; --i ) trns2 = trns.getInverse(); } }; template< int nProbes > void testInverse( const base::transform& t1, const base2::transform& t2 ) { const int n = SCALE; typedef inverse inverse1_type; double dblMin1 = mesure( inverse1_type( t1 ), nProbes ); dblMin1 /= n; typedef inverse inverse2_type; double dblMin2 = mesure( inverse2_type( t2 ), nProbes ); dblMin2 /= n; print_result( dblMin1, dblMin2 ); } template< int nProbes > void testTransInverse( int i ) { out << ""; #if 0 out << "rot:" << tsmpl[i].rot << " flip:" << tsmpl[i].flip << " mag:" << tsmpl[i].mag << " x:" << tsmpl[i].xloc << " y:" << tsmpl[i].yloc << ""; out << "rot:" << tsmpl[j].rot << " flip:" << tsmpl[j].flip << " mag:" << tsmpl[j].mag << " x:" << tsmpl[j].xloc << " y:" << tsmpl[j].yloc << ""; #endif testInverse(mktrans(i), mktrans(i) ); out << "" << std::endl; } template< int nProbes > void testAllTransInverse() { for ( int i = 0; i < tsmpl_count; ++i ) testTransInverse(i); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// void print_result( double time1, double time2 ) { out << "" << std::setiosflags( std::ios::fixed ) << std::setprecision( 12 ) << time1 << "" << time2 << "" << std::setprecision( 6 ) << (1. - time2/time1 )*100 << "%"; // printf( "t1 %f t2 %f fast %.3f%%\n", dblDiff1/nProbes, dblDiff2/nProbes, (dblDiff1/dblDiff2-1.)*100, nProbes ); } template< int nProbes > void testTransform() { out << "pod::point<int32>
" << "pod::point<int64>
" << "pod::point<double>
" << "pod::rectangle<int32>
" << "pod::rectangle<int64>
" << "pod::rectangle<double>
" << "trans*trans
" << "trans-1


"; std::cout << "pod::point" << std::endl; out << "

pod::point<int32>

" << std::endl; testAllPt(); out << "

"; std::cout << "pod::point" << std::endl; out << "

pod::point<int64>

" << std::endl; testAllPt(); out << "

"; std::cout << "pod::point" << std::endl; out << "

pod::point<double>

" << std::endl; testAllPt(); out << "

"; std::cout << "pod::rectangle" << std::endl; out << "

pod::rectangle<int32>

" << std::endl; testAllRect(); out << "

"; std::cout << "pod::rectangle" << std::endl; out << "

pod::rectangle<int64>

" << std::endl; testAllRect(); out << "

"; std::cout << "pod::rectangle" << std::endl; out << "

pod::rectangle<double>

" << std::endl; testAllRect(); out << "

"; std::cout << "trans*trans" << std::endl; out << "

trans*trans

" << std::endl; testAllTrans1x1(); out << "

"; std::cout << "inverse trans" << std::endl; out << "

trans-1

" << std::endl; testAllTransInverse(); out << "

"; } void main ( ) { out.open( "result.html" ); out << "" << std::endl; // Init perf_init(); base::transform::initFnTables(); base2::transform::initFnTables(); testTransform<100>(); out << ""; out.close(); #ifdef WIN32 PROCESS_INFORMATION pi; STARTUPINFO si; memset( &pi, 0, sizeof( pi ) ); memset( &si, 0, sizeof( si ) ); BOOL b = CreateProcess( L"C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE", L"IEXPLORE.EXE file:///D:/work/prj/test/testTransform/result.html", 0, 0, false, 0, 0, 0, &si, &pi ); #endif }