<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'><div dir='ltr'>
<font class="Apple-style-span" face="Tahoma" size="2"><br></font><div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">#include &lt;vector&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">#include &lt;string&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">#include &lt;fstream&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">#include &lt;iostream.h&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">#include &lt;map&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">#include &lt;cstdio&gt;</font></div><div><font class="Apple-style-span" face="Tahom
 a" size="2">#include &lt;cstring&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">#include &lt;climits&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">#include &lt;sys/time.h&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">#include &lt;sys/resource.h&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">#include &lt;vector&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">#include &lt;cassert&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">#include &lt;stack&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">#include &lt;algorithm&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">#include &lt;cmath&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">#include "mpi.h"</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><
 div><font class="Apple-style-span" face="Tahoma" size="2">//--------------------------fplan.h--------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">using namespace std;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">struct Pin{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int mod;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int net;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int x,y; &nbsp; &nbsp;// relative position</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int ax,ay; &nbsp;// absolute position</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; Pin(int x_=-1,int y_=-1){ x=x_,y=y_; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">};</font></di
 v><div><font class="Apple-style-span" face="Tahoma" size="2">typedef vector&lt;Pin&gt; Pins;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">typedef Pin* Pin_p;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">typedef vector&lt;Pin_p&gt; Net;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">typedef vector&lt;Net &gt; Nets;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">enum Module_Type { MT_Hard, MT_Soft, MT_Reclinear, MT_Buffer };</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">struct Module{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; char name[20];</font></div><div><font class="Apple-style-spa
 n" face="Tahoma" size="2">&nbsp; int width,height;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int x,y;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int area;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; Pins pins;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; Module_Type type;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">};</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">typedef vector&lt;Module&gt; Modules;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">struct Module_Info{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; bool rotate, flip;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int x,y;</font></div><div><font class="Apple-style-sp
 an" face="Tahoma" size="2">&nbsp; int rx,ry;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">};</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">typedef vector&lt;Module_Info&gt; Modules_Info;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">class FPlan{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; public:</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; int rank;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int Size;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; FPlan(const Modules&amp; modules,const Modules_Info&amp; modules_info)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp
 ; &nbsp; {</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; int rank = MPI::COMM_WORLD.Get_rank();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int Size = MPI::COMM_WORLD.Get_size();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int sendModule_Info(int proc, int tag);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int receiveModule_Info(int proc, int tag);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int sendModule(int proc, int tag);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int receiveModule(int proc, int tag);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; FPlan(float calpha);</font></div><div><font class="Apple-style-span" face="T
 ahoma" size="2">&nbsp; &nbsp; void read(char*);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; virtual void init()<span class="Apple-tab-span" style="white-space:pre">                </span>=0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; virtual void packing();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; virtual void perturb()<span class="Apple-tab-span" style="white-space:pre">        </span>=0; &nbsp; &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; virtual void keep_sol()<span class="Apple-tab-span" style="white-space:pre">        </span>=0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; virtual void keep_best()<span class="Apple-tab-span" style="white-space:pre">        </span>=0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; virtual void recover()<span class="Apple-tab
 -span" style="white-space:pre">        </span>=0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; virtual void recover_best() =0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; virtual double getCost(); &nbsp; &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int &nbsp; &nbsp;size() &nbsp; &nbsp; &nbsp; &nbsp; { return modules_N; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; double getTotalArea() { return TotalArea; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; double getArea() &nbsp; &nbsp; &nbsp;{ return Area; &nbsp; &nbsp; &nbsp;}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int &nbsp; &nbsp;getWireLength(){ return WireLength;}</font></div><div><font class="Apple-style-
 span" face="Tahoma" size="2">&nbsp; &nbsp; double getWidth() &nbsp; &nbsp; { return Width; &nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; double getHeight() &nbsp; &nbsp;{ return Height; &nbsp; &nbsp;}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; float &nbsp;getDeadSpace();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; // information</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void list_information();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void show_modules(); &nbsp; &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void normalize_cost(int);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;&nbsp;</font></div>
 <div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; protected:</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void clear();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; double calcWireLength();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void scaleIOPad();&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; double Area;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; double Width,Height;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int WireLength;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; double TotalArea;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;&nbsp;</font></div><div><
 font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int modules_N; &nbsp; &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; Modules modules;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; Module &nbsp;root_module;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; Modules_Info modules_info; &nbsp; &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; Nets network;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; double norm_area, norm_wire;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; float cost_alpha;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; vector&lt;vector&lt;int&gt; &gt; connection;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;&nbsp;</font></div><div>
 <font class="Apple-style-span" face="Tahoma" size="2">&nbsp; private:</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void read_dimension(Module&amp;);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void read_IO_list(Module&amp;,bool parent);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void read_network();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void create_network(); &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; map&lt;string,int&gt; net_table;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; string filename;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">};</font></div><div><font class="Apple-style-span" face="Tahoma" size="
 2">int FPlan::sendModule_Info(int proc, int tag) {</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;int blockcounts[6] = {1,1,1,1,1,1};//count of the blocks of the subsequent type</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Datatype types[6];//number of the types used in the mpi struct</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Aint &nbsp; &nbsp; displs[6];//record of the displacement from the beginning of a particular type block</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Datatype FPlan_Module_Info;// name of the mpi structure object</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font c
 lass="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;// initialize types and displs with addresses of items</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules_info[0].rotate, &amp;displs[0] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules_info[0].flip, &amp;displs[1] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules_info[0].x, &amp;displs[2] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules_info[0].y, &amp;displs[3] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules_info[0].rx, &amp;displs[4] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules_info[0].ry,
  &amp;displs[5] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;//consecutive types in mpi</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[0] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[1] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[2] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;types[3] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[4] = MPI_INT ;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[5] = MPI_INT ;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font cl
 ass="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; for (int i = 5; i &gt;= 0; i --) &nbsp;//substracting the base address from the subsequent displacements</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; displs [i] -= displs [0];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;//MPI_Type_struct( no, blockcounts, displs, types,mpi_structure);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Type_struct( 6, blockcounts, displs, types, &amp;FPlan_Module_Info );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; //use the structure in mpi</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Type_commit( &amp;FPlan_Module_Info );</font></div><div><font class="Apple-style-span" face=
 "Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; // send the mpi structure</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Send(&amp;modules_info, modules_N, FPlan_Module_Info , proc, tag, MPI_COMM_WORLD);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; return 1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// A function for defining a structure for MPI to collect the node/state object through out the processes</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">int FPlan::receiveModule_Info(int proc,
  int tag) {</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;int blockcounts[6] = {1,1,1,1,1,1};//count of the blocks of the subsequent type</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Datatype types[6];//number of the types used in the mpi struct</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Aint &nbsp; &nbsp; displs[6];//record of the displacement from the beginning of a particular type block</font></div><div><font class="Apple-style-span" face="Tahoma" size="2
 ">&nbsp; &nbsp; &nbsp;MPI_Datatype FPlan_Module_Info;// name of the mpi structure object</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;MPI_Status status;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;// initialize types and displs with addresses of items</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules_info[0].rotate, &amp;displs[0] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules_info[0].flip, &amp;displs[1] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules_info[0].x, &amp;displs[2] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules_info[0].y, &amp;displs[3] );</font></div><div><font class="Apple-style-spa
 n" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules_info[0].rx, &amp;displs[4] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules_info[0].ry, &amp;displs[5] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;//consecutive types in mpi</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[0] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[1] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[2] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;types[3] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;type
 s[4] = MPI_INT ;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[5] = MPI_INT ;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; for (int i = 5; i &gt;= 0; i --) &nbsp;//substracting the base address from the subsequent displacements</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; displs [i] -= displs [0];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;//MPI_Type_struct( no, blockcounts, displs, types,mpi_structure);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Type_struct( 6, blockcounts, displs, types, &amp;FPlan_Module_Info );</font></div><div><font class="Apple-style-span" face="Tahoma" s
 ize="2">&nbsp; &nbsp; //use the structure in mpi</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Type_commit( &amp;FPlan_Module_Info );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; // send the mpi structure</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;MPI_Recv(&amp;modules_info,modules_N, FPlan_Module_Info , proc, tag, MPI_COMM_WORLD, &amp;status);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; return 1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Ap
 ple-style-span" face="Tahoma" size="2">int FPlan::sendModule(int proc, int tag) {</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;int blockcounts[8] = {1,20,1,1,1,1,1,1};//count of the blocks of the subsequent type</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Datatype types[8];//number of the types used in the mpi struct</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Aint &nbsp; &nbsp; displs[8];//record of the displacement from the beginning of a particular type block</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Datatype FPlan_Module;// name of the mpi structure object</font></div><div><font class="Apple-style-span" face="Tahoma" size="2
 "><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;// initialize types and displs with addresses of items</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules[0].id, &amp;displs[0] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules[0].name[20], &amp;displs[1] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules[0].width, &amp;displs[2] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules[0].height, &amp;displs[3] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules[0].x, &amp;displs[4] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modul
 es[0].y, &amp;displs[5] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules[0].area, &amp;displs[6] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules[0].type, &amp;displs[7] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;//consecutive types in mpi</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[0] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[1] = MPI_CHAR;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[2] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;types[3] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[4] = MP
 I_INT ;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[5] = MPI_INT ;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[6] = MPI_INT ;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; types[7] = MPI_INT ;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; for (int i = 7; i &gt;= 0; i --) &nbsp;//substracting the base address from the subsequent displacements</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; displs [i] -= displs [0];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;//MPI_Type_struct( no, blockcounts, displs, types,mpi_structure);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbs
 p; MPI_Type_struct( 8, blockcounts, displs, types, &amp;FPlan_Module );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; //use the structure in mpi</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Type_commit( &amp;FPlan_Module );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; // send the mpi structure</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Send(&amp;modules,modules_N, FPlan_Module, proc, tag, MPI_COMM_WORLD);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; return 1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><di
 v><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;/*struct Module{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int id; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //id of the module</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; char name[20]; &nbsp; &nbsp;//name of the module</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int width,height; //height and width of the module</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int x,y; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//coordinate of the module</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int area; &nbsp; &nbsp; &nbsp; &nbsp; //total area of the module</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; Pins pins; &nbsp; &nbsp; &nbsp; &nbsp;//array of pins contained in a module</font></div><div><font class="Apple-style-span" face="Tahoma" size="2
 ">&nbsp; Module_Type type; //type of the module</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">};*/</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// A function for defining a structure for MPI to collect the node/state object through out the processes</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">int FPlan::receiveModule(int proc, int tag) {</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; int blockcounts[8] = {1,20,1,1,1,1,1,1};//count of the blocks of the subsequent type</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Datatype types[8];//number of the types used in the mpi struct</font></
 div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Aint &nbsp; &nbsp; displs[8];//record of the displacement from the beginning of a particular type block</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Datatype FPlan_Module;// name of the mpi structure object</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MPI_Status status;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;// initialize types and displs with addresses of items</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;MPI_Address( &amp;modules[0].id, &amp;displs[0] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules[0].name[20], &amp;displs[1] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;M
 PI_Address( &amp;modules[0].width, &amp;displs[2] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules[0].height, &amp;displs[3] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules[0].x, &amp;displs[4] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules[0].y, &amp;displs[5] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules[0].area, &amp;displs[6] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;modules[0].type, &amp;displs[7] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;//consecutive types in mpi</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[0] = 
 MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[1] = MPI_CHAR;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[2] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;types[3] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[4] = MPI_INT ;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[5] = MPI_INT ;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[6] = MPI_INT ;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; types[7] = MPI_INT ;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; for (int i = 7; i &gt;= 0; i 
 --) &nbsp;//substracting the base address from the subsequent displacements</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; displs [i] -= displs [0];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;//MPI_Type_struct( no, blockcounts, displs, types,mpi_structure);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Type_struct( 8, blockcounts, displs, types, &amp;FPlan_Module );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; //use the structure in mpi</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Type_commit( &amp;FPlan_Module );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; // send the mpi structure</font></div><div><font class="Apple-style
 -span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;MPI_Recv(&amp;modules, modules_N, FPlan_Module, proc, tag, MPI_COMM_WORLD, &amp;status);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; return 1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void error(char *msg,char *msg2="");</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">bool rand_bool();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">float rand_01();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">double seconds(
 );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">extern float init_avg;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">extern float avg_ratio;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">extern float lamda;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">double SA_Floorplan(FPlan &amp;fp, int k, int local=0, float term_T=0.1);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">double Random_Floorplan(FPlan &amp;fp,int times);</font></div><div><font class="Apple-style
 -span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//--------------------------------fplan.cpp---------------------------------//</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// Project: B*-trees floorplanning</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// Advisor: Yao-Wen Chang &nbsp;&lt;ywchang@cis.nctu.edu.tw&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// Authors: Jer-Ming Hsu &nbsp; &lt;barz@cis.nctu.edu.tw&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// <span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp; &nbsp;Hsun-Cheng Lee &lt;gis88526@cis.nctu.edu.tw&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// Sponsor: Arcadia Inc.</font></div><div><font class="Apple-style-span" face="Tahoma" siz
 e="2">// Date: &nbsp; &nbsp;7/19/2000 ~</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">char line[100],t1[40],t2[40];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">ifstream fs;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">FPlan::FPlan(float calpha=1){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; int rank = MPI::COMM_WORLD.Get_rank();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &
 nbsp; int Size = MPI::COMM_WORLD.Get_size();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; norm_area= 1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; norm_wire= 1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; cost_alpha=calpha;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void FPlan::packing(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(cost_alpha!=1)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;calcWireLength();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size
 ="2">void FPlan::clear(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; Area = 0;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; WireLength = 0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">double FPlan::getCost(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(cost_alpha==1)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;return cost_alpha*(Area/norm_area);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; else if(cost_alpha &lt; 1e-4)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;return (WireLength/norm_wire);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;
  else</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;return cost_alpha*(Area/norm_area)+(1-cost_alpha)*(WireLength/norm_wire);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">float FPlan::getDeadSpace(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; return 100*(Area-TotalArea)/float(Area);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void FPlan::normalize_cost(int t){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; norm_area=norm_wire=0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><
 font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(int i=0; i &lt; t; i++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; perturb();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; packing();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; norm_area += Area;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; norm_wire += WireLength;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; norm_area /= t;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; norm_wire /= t;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; printf("normalize area=%.0f, wire=%.0f\n", norm_area, norm_wire)
 ;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; Read</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">char* tail(char *str){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; str[strlen(str)-1]=0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; return str;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font><
 /div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void FPlan::read(char *file){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; filename = file;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; fs.open(file);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(fs==NULL)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; error("unable to open file: %s",file);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; bool final=false;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; Module dummy_mod;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(int i=0; !fs.eof(); i++){</font></div><div><font class="Appl
 e-style-span" face="Tahoma" size="2">&nbsp; &nbsp; // modules</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; modules.push_back(dummy_mod);<span class="Apple-tab-span" style="white-space:pre">        </span>// new module</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; Module &amp;mod = modules.back();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod.id = i;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod.pins.clear();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; fs &gt;&gt; t1 &gt;&gt; t2;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; tail(t2);<span class="Apple-tab-span" style="white-space:pre">                        </span>// remove ";"</font></div><div><font class="Apple-style-span" face="Tahom
 a" size="2">&nbsp; &nbsp; strcpy(mod.name,t2);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; fs &gt;&gt; t1 &gt;&gt; t2;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(!strcmp(t2,"PARENT;"))</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><span class="Apple-tab-span" style="white-space:pre">        </span>final= true;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; // dimension</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; read_dimension(mod); &nbsp; &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; read_IO_list(mod,final);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></f
 ont></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; // network</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(final){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; read_network();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; break;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; root_module = modules.back();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; modules.pop_back();<span class="Apple-tab-span" style="white-space:pre">                </span>// exclude the parent module</font></div><div><font class="Apple-style-span" face=
 "Tahoma" size="2">&nbsp; modules_N = modules.size(); &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; modules_info.resize(modules_N);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; modules.resize(modules_N);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; create_network();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; TotalArea = 0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(int i=0; i &lt; modules_N; i++)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; TotalArea += modules[i].area;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="
 2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void FPlan::read_dimension(Module &amp;mod){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; fs &gt;&gt; t1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int min_x=INT_MAX,min_y=INT_MAX,max_x=INT_MIN,max_y=INT_MIN;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int tx,ty;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; for(int i=0; i &lt; 4;i++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; fs &gt;&gt; tx &gt;&gt; ty;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; min_x=min(min_x,tx); max_x=max(max_x,tx);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp
 ; &nbsp; &nbsp; min_y=min(min_y,ty); max_y=max(max_y,ty);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod.x &nbsp; &nbsp; &nbsp;= min_x;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod.y &nbsp; &nbsp; &nbsp;= min_y;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod.width &nbsp;= max_x - min_x;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod.height = max_y - min_y;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod.area &nbsp; = mod.width * mod.height;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; fs &gt;&gt; t1 &gt;&gt; t2;</font></div><div><font class="Apple-style-span" face="Tah
 oma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void FPlan::read_IO_list(Module &amp;mod,bool parent=false){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; // IO list</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; while(!fs.eof()){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; Pin p;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; fs.getline(line,100);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; if(strlen(line)==0) continue;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; sscanf(line,"%s %*s %d %d",t1,&amp;p.x,&amp;p.y);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><
 div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; if(!strcmp(t1,"ENDIOLIST;"))</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><span class="Apple-tab-span" style="white-space:pre">        </span>break;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; if(parent){ // IO pad is network</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;// make unique net id</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; net_table.insert(make_pair(string(t1),net_table.size()));</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; p.net = net_table[t1];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" 
 face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; p.mod = mod.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; p.x -= mod.x; &nbsp;p.y -= mod.y;<span class="Apple-tab-span" style="white-space:pre">        </span>// shift to origin</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; mod.pins.push_back(p);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; fs.getline(line,100);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void FPlan::read_network(){</font></div><di
 v><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; while(!fs.eof()){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; bool end=false;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; int n=0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; fs &gt;&gt; t1 &gt;&gt; t2;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; if(!strcmp(t1,"ENDNETWORK;"))</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; break;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; // determine which module interconnection by name</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; int m_id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; for(m_id
 =0; m_id &lt; modules.size(); m_id++)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; if(!strcmp(modules[m_id].name,t2))</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;break;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; if(m_id== modules.size())</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;<span class="Apple-tab-span" style="white-space:pre">        </span>error("can't find suitable module name!");</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; while(!fs.eof()){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; fs &gt;&gt; t1;</font></div><div><font class=
 "Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; if(t1[strlen(t1)-1]==';'){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;<span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;tail(t1);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end=true;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; // make unique net id</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; net_table.insert(make_pair(string(t1),net_table.size()));</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; modules[m_id].pins[n++].net = net_table[t1];</font></div><div><font
  class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; if(end) break;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; Wire Length Estimate</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void FPlan::create_n
 etwork(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; network.resize(net_table.size());</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(int i=0; i &lt; modules_N; i++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; for(int j=0; j &lt; modules[i].pins.size(); j++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; Pin &amp;p = modules[i].pins[j];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; network[p.net].push_back(&amp;p);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span"
  face="Tahoma" size="2">&nbsp; for(int j=0; j &lt; root_module.pins.size(); j++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; Pin &amp;p = root_module.pins[j];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; network[p.net].push_back(&amp;p);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; connection.resize(modules_N+1);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(int i=0; i &lt; modules_N+1; i++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; connection[i].resize(modules_N+1);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; fill(connection[i].begin(), connection[i].end(), 0);</font></div><div><font class
 ="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(int i=0; i &lt; network.size(); i++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; for(int j=0; j &lt; network[i].size()-1; j++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; int p= network[i][j]-&gt;mod;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; for(int k=j+1 ; k &lt; network[i].size(); k++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; int q= network[i][k]-&gt;mod;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; connection[p][q]++;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; 
 connection[q][p]++; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void FPlan::scaleIOPad(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; float px = Width/float(root_module.width);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; float py = Height/float(root_module.height);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-st
 yle-span" face="Tahoma" size="2">&nbsp; for(int i=0; i &lt; root_module.pins.size(); i++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; Pin &amp;p = root_module.pins[i];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; p.ax = int(px * p.x);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; p.ay = int(py * p.y);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">double FPlan::calcWireLength()</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></d
 iv><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; scaleIOPad();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; WireLength=0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; // compute absolute position</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(int i=0; i &lt; modules_N; i++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int mx= modules_info[i].x, my= modules_info[i].y;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; bool rotate= modules_info[i].rotate;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int w= modules[i].width;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; for(int j=0; j &lt; modules[i].pins.size(); j++){</font></div><d
 iv><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; Pin &amp;p = modules[i].pins[j];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; if(!rotate){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; p.ax= p.x+mx, p.ay= p.y+my;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; else{ // Y' = W - X, X' = Y</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><span class="Apple-tab-span" style="white-space:pre">        </span>p.ax= p.y+mx, p.ay= (w-p.x)+my;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div
 ><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(int i=0; i &lt; network.size(); i++)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; {</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int max_x= INT_MIN, max_y= INT_MIN;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int min_x= INT_MAX, min_y= INT_MAX;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; assert(network[i].size() &gt; 0);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; for(int j=0; j &lt; network[i].size(); j++)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &
 nbsp; {</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; Pin &amp;p = *network[i][j];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; max_x= max(max_x, p.ax), max_y= max(max_y, p.ay);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; min_x= min(min_x, p.ax), min_y= min(min_y, p.ay);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; &nbsp;printf("%d %d %d %d\n",max_x,min_x,max_y,min_y);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; WireLength += (max_x-min_x)+(max_y-min_y);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; return WireLength;</font></div><div><font class="Apple-style-span" 
 face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; Modules Information</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">string query_map(map&lt;string,int&gt; M,int value){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(map&lt;string,int&gt;::iterator p=M.begin(); p != M.end(); p++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(p-&gt;second == value)</font></div><div><font class="A
 pple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; return p-&gt;first;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; return "";</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void FPlan::show_modules()</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(int i=0; i &lt; modules.size();i++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; cout &lt;&lt; "Module: " &lt;&lt; modules[i].name &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; cout &lt;&lt; " &nbsp;Width = " &lt;&lt; modules[i].width&lt;&lt;
  endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; cout &lt;&lt; " &nbsp;Height= " &lt;&lt; modules[i].height &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; cout &lt;&lt; " &nbsp;Area &nbsp;= " &lt;&lt; modules[i].area &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; &nbsp;cout &lt;&lt; modules[i].pins.size() &lt;&lt; " Pins:\n";</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; &nbsp;for(int j=0; j &lt; modules[i].pins.size(); j++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; &nbsp; &nbsp;cout &lt;&lt; query_map(net_table,modules[i].pins[j].net) &lt;&lt; " ";</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; &nbsp; &nbsp;cout &lt;&lt; modules[i].pins[j].x &lt;&lt; " " &lt;&lt; modules[i].pins[j].y &lt;&lt; endl;</font></div><div><font cla
 ss="Apple-style-span" face="Tahoma" size="2">// &nbsp; &nbsp;}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void FPlan::list_information(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; string info = filename + ".info"; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; ofstream of(info.c_str());</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; of &lt;&lt; modules_N &lt;&lt; " " &lt;&lt; Width &lt;&lt; " " &lt;&lt; Height &lt;&lt; endl;</font></div><div><font class="Ap
 ple-style-span" face="Tahoma" size="2">&nbsp; for(int i=0; i &lt; modules_N; i++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; of &lt;&lt; modules_info[i].x &nbsp;&lt;&lt; " " &lt;&lt; modules_info[i].rx &nbsp;&lt;&lt; " ";</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; of &lt;&lt; modules_info[i].y &lt;&lt; " " &lt;&lt; modules_info[i].ry &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; of &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; calcWireLength();&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int x,y,rx,ry;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(int i=0; i &lt; network.
 size(); i++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; assert(network[i].size()&gt;0);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; x = network[i][0]-&gt;ax;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; y = network[i][0]-&gt;ay;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; for(int j=1; j &lt; network[i].size(); j++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; rx = network[i][j]-&gt;ax;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; ry = network[i][j]-&gt;ay;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; of &lt;&lt; x &lt;&lt; " " &lt;&lt; y &lt;&lt; " " &lt;&lt; rx &lt;&lt; " " &lt;&lt; 
 ry &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; x = rx, y = ry;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; cout &lt;&lt; "Num of Module &nbsp;= " &lt;&lt; modules_N &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; cout &lt;&lt; "Height &nbsp; &nbsp; &nbsp; &nbsp; = " &lt;&lt; Height*1e-3 &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; cout &lt;&lt; "Width &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= " &lt;&lt; Width*1e-3 &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; cout &lt;&lt; "Area &nbsp; &nbsp; &nbsp; &nbsp; &nb
 sp; = " &lt;&lt; Area*1e-6 &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; cout &lt;&lt; "Wire Length &nbsp; &nbsp;= " &lt;&lt; calcWireLength()*1e-3 &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; cout &lt;&lt; "Total Area &nbsp; &nbsp; = " &lt;&lt; TotalArea*1e-6 &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; printf( "Dead Space &nbsp; &nbsp; = %.2f\n", getDeadSpace());</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; Auxilliary Functions</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//-----
 ----------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void error(char *msg,char *msg2){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; printf(msg,msg2);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; cout &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; throw 1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">bool rand_bool(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; return bool(rand()%2);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-sp
 an" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">float rand_01(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; return float(rand()%10000)/10000;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">double seconds(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;rusage time;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;getrusage(RUSAGE_SELF,&amp;time);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;return (double)(1.0*time.ru_utime.tv_sec+0.000001*time.ru_utime.tv_usec);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//
 --------------------------------------sa.h----------------------------------//</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">float init_avg = 0.00001;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">int hill_climb_stage = 7;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">float avg_ratio=150;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">float lamda=1.3;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">double mean(vector&lt;double&gt; &amp;chain){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; double sum=0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(int i=0; i &lt; chain.size();i++)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;sum+= chain[i];</font></div><div><font class
 ="Apple-style-span" face="Tahoma" size="2">&nbsp; return sum/chain.size();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">double std_var(vector&lt;double&gt; &amp;chain){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; double m = mean(chain);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; double sum=0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; double var;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int N= chain.size();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(int i=0; i &lt; N;i++)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nb
 sp; &nbsp;sum += (chain[i]-m)*(chain[i]-m);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; var = sqrt(sum/(N-1));</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; printf(" &nbsp;m=%.4f ,v=%.4f\n",m,var);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; return var;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">/* Simulated Annealing B*Tree Floorplan</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;k: factor of the number of permutation in one temperature</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nb
 sp;local: local search iterations</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;termT: terminating temperature</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">*/</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//----------------------sa.cpp--------------------------------//</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">double SA_Floorplan(FPlan &amp;fp, int k, int local, float term_T)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int MT,uphill,reject;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; double pre_cost,best,cost;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; float d_cost,reject_rate;</font></div><div><font class="Appl
 e-style-span" face="Tahoma" size="2">&nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int N = k * fp.size();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; float P=0.9;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; float T,actual_T=1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; double avg=init_avg;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; float conv_rate = 1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; double time=seconds();&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; double estimate_avg = 0.08 / avg_ratio;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; cout &lt;&lt; "Estimate Average Delta Cost = " &lt;&lt; estimate_avg &lt
 ;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(local==0)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; avg = estimate_avg;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; T = avg / log(P); &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; // get inital solution</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; fp.packing();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; fp.keep_sol(); &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; fp.keep_best();</font></div><div><font class="Apple-style-span" face="T
 ahoma" size="2">&nbsp; pre_cost = &nbsp;best = fp.getCost();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int good_num=0,bad_num=0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; double total_cost=0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int count=0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; ofstream of("/tmp/btree_debug");</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; do{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;count++;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;total_cost = 0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;MT=u
 phill=reject=0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;printf("Iteration %d, T= %.2f\n", count, &nbsp;actual_T);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;vector&lt;double&gt; chain;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;for(; uphill &lt; N &amp;&amp; MT &lt; 2*N; MT++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;fp.perturb();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;fp.packing();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;cost = fp.getCost();&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size
 ="2">&nbsp; &nbsp; &nbsp; &nbsp;d_cost = cost - pre_cost;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;float p = exp(d_cost/T);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;chain.push_back(cost);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;if(d_cost &lt;=0 || rand_01() &lt; p ){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fp.keep_sol();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pre_cost = cost;</font></div><div><font class="Apple-style-span" face="Ta
 homa" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(d_cost &gt; 0){ &nbsp; &nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;uphill++, bad_num++;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;of &lt;&lt; d_cost &lt;&lt; ": " &lt;&lt; p &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}else &nbsp;if(d_cost &lt; 0) &nbsp;good_num++;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// keep best solution</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(cost &lt; best){</font></div><div><font class="App
 le-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fp.keep_best();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;best = cost;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(" &nbsp; ==&gt; &nbsp;Cost= %f, Area= %.6f, ", best, fp.getArea()*1e-6);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf("Wire= %.3f\n", fp.getWireLength()*1e-3); &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;assert(fp.getArea() &gt;= fp.getTotalArea());</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;time = seconds(); &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</font><
 /div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;else{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;reject++;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fp.recover();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; cout &lt;&lt; T &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;double sv = std_var(chain);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;float r_t = exp(lamda*T/sv);</font></div><div><font class="Apple
 -style-span" face="Tahoma" size="2">&nbsp; &nbsp;T = r_t*T;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;// After apply local-search, start to use normal SA</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;if(count == local){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;T = estimate_avg/ log(P);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;T *= pow(0.9,local);<span class="Apple-tab-span" style="white-space:pre">                </span>// smothing the annealing schedule</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;actual_T = exp(estimate_avg/T);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;}</fo
 nt></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;if(count &gt; local){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;actual_T = exp(estimate_avg/T);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;conv_rate = 0.95;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;reject_rate = float(reject)/MT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;printf(" &nbsp;T= %.2f, r= %.2f, reject= %.2f\n\n", actual_T, r_t, reject_rate);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }while(reject_rate &lt; conv_rate &amp;&amp; actual_T &gt
 ; term_T);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(reject_rate &gt;= conv_rate)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; cout &lt;&lt; "\n &nbsp;Convergent!\n";</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; else if(actual_T &lt;= term_T)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; cout &lt;&lt; "\n Cooling Enough!\n";</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; printf("\n good = %d, bad=%d\n\n", good_num, bad_num);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; fp.recover_best();</font></div><div><font class="Apple-style-span" face=
 "Tahoma" size="2">&nbsp; fp.packing();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; return time;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">double Random_Floorplan(FPlan &amp;fp,int times){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int N =times,t=0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; double total_cost=0,pre_cost,cost,best;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; fp.packing();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; pre_cost = best = fp.getCost();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><di
 v><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;do{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(int i=0; i &lt; N;i++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; fp.perturb();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; fp.packing();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; cost = fp.getCost();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(cost-pre_cost &gt; 0){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; t++;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; total_cost += cost-pre_cost;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; pre_cost
  = cost;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(cost &lt; best){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; fp.keep_best();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; best = cost;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; cout &lt;&lt; "==&gt; Cost=" &lt;&lt; best &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }<span class="Apple-tab-span" style="white-space:pre">        </span></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;}while(total_cost==0);</font></div><div><fon
 t class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; fp.recover_best();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; fp.packing();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; total_cost /= t;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; return total_cost;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//------------------------------------Btree------------------------------------//</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// Project: B*-trees floorplanning</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// Advisor: Yao-Wen Chang &nbsp;&lt;ywchang@cis.nctu.edu.tw&gt;</font></di
 v><div><font class="Apple-style-span" face="Tahoma" size="2">// Authors: Jer-Ming Hsu &nbsp; &lt;barz@cis.nctu.edu.tw&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// <span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp; &nbsp;Hsun-Cheng Lee &lt;gis88526@cis.nctu.edu.tw&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// Sponsor: Arcadia Inc.</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// Date: &nbsp; &nbsp;7/19/2000 ~</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">const int NIL = -1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">typedef bool DIR;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">const bool LEFT=0, RIGHT=1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-st
 yle-span" face="Tahoma" size="2">struct Node{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int id,parent,left,right;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int rotate,flip;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int isleaf(){ return (left==NIL &amp;&amp; right==NIL); }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">};</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">struct Contour{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int front,back;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">};</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">class B_Tree : public FPlan{</font></div><div><font cl
 ass="Apple-style-span" face="Tahoma" size="2">&nbsp; public:</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int sendcontour(int proc, int tag);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int receivecontour(int proc, int tag);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int sendNode(int proc, int tag);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int receiveNode(int proc, int tag);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;B_Tree(const B_Tree&amp; obj,int i):FPlan(obj.modules,obj.modules_info)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; {</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; nodes[i].id=obj.nodes[i].id;</font></div><div
 ><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; nodes[i].parent=obj.nodes[i].parent;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; nodes[i].left=obj.nodes[i].left;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; nodes[i].right=obj.nodes[i].right;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; nodes[i].flip=obj.nodes[i].flip;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; <span class="Apple-tab-span" style="white-space:pre">                </span> contour[i].front=obj.contour[i].front;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; contour[i].back=obj.contour[i].back;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &
 nbsp; &nbsp; <span class="Apple-tab-span" style="white-space:pre">        </span>modules[i].id=obj.modules[i].id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;modules[i].name[20]=obj.modules[i].name[20];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;modules[i].width=obj.modules[i].width;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;modules[i].height=obj.modules[i].height;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;modules[i].x=obj.modules[i].x;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;modules[i].y=obj.modules[i].y;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;modules[i].area=obj.modules[i].area;</font></div><div><font class
 ="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;modules[i].pins=obj.modules[i].pins;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; modules[i].type=obj.modules[i].type;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">                </span>modules_info[i].rotate=obj.modules_info[i].rotate;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;modules_info[i].flip=obj.modules_info[i].flip;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;modules_info[i].x=obj.modules_info[i].x;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;modules_info[i].y=obj.modules_info[i].y;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;
  &nbsp; &nbsp; &nbsp;modules_info[i].rx=obj.modules_info[i].rx;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;modules_info[i].ry=obj.modules_info[i].ry;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; B_Tree(float calpha=1) :FPlan(calpha)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; {</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; virtual void init();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; virtual void packing();</font></div><div><fo
 nt class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; virtual void perturb();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; virtual void keep_sol();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; virtual void keep_best(); &nbsp; &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; virtual void recover();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; virtual void recover_best();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; // debuging</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void testing();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;
  protected:</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void show_tree(); &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int place_module(int mod,int abut,bool is_left=true);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; bool legal();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void clear();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; // Auxilary function</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void wire_nodes(int parent,int child,DIR edge);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int child(int node,DIR d
 );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; bool legal_tree(int p,int n,int &amp;num);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void add_changed_nodes(int n);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; // SA permutating operation</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void swap_node(Node &amp;n1, Node &amp;n2);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void insert_node(Node &amp;parent,Node &amp;node);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void delete_node(Node &amp;node);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"
 >&nbsp; &nbsp; bool delete_node2(Node &amp;node,DIR pull);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void insert_node2(Node &amp;parent,Node &amp;node,</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DIR edge,DIR push,bool fold=false);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int contour_root;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; vector&lt;Contour&gt; contour;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int nodes_root;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; vector&lt;Node&gt; nodes; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><di
 v><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; private: &nbsp; &nbsp; &nbsp; &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; struct Solution{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; int nodes_root;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; vector&lt;Node&gt; nodes;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; double cost;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; Solution() { cost = 1; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; void clear() { cost = 1, nodes.clear(); }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; };</font></div><div><font class="Apple-sty
 le-span" face="Tahoma" size="2">&nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void get_solution(Solution &amp;sol);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void recover(Solution &amp;sol);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; void recover_partial();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; Solution best_sol, last_sol;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; // for partial recover</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; vector&lt;Node&gt; changed_nodes;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int changed_root; &nbsp; &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma
 " size="2">};</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">int B_Tree::sendcontour(int proc, int tag) {</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;int blockcounts[2] = {1,1};//count of the blocks of the subsequent type</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Datatype types[2];//number of the types used in the mpi struct</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Aint &nbsp; &nbsp; displs[2];//record of the displacement from the beginning of a particular type block</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Datatype B_Tree_
 contour;// name of the mpi structure object</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;// initialize types and displs with addresses of items</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;contour[0].front, &amp;displs[0] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;contour[0].back, &amp;displs[1] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;//consecutive types in mpi</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[0] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[1] = MPI_INT;</font></div><div><
 font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; for (int i = 1; i &gt;= 0; i --) &nbsp;//substracting the base address from the subsequent displacements</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; displs [i] -= displs [0];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;//MPI_Type_struct( no, blockcounts, displs, types,mpi_structure);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Type_struct( 2, blockcounts, displs, types, &amp;B_Tree_contour );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; //use the structure in mpi</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Type_commit(
  &amp;B_Tree_contour );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; // send the mpi structure</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Send(&amp;contour, modules_N, B_Tree_contour, proc, tag, MPI_COMM_WORLD);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; return 1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">int B_Tree::receivecontour(int proc, int tag) {</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font c
 lass="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;int blockcounts[2] = {1,1};//count of the blocks of the subsequent type</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Datatype types[2];//number of the types used in the mpi struct</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Aint &nbsp; &nbsp; displs[2];//record of the displacement from the beginning of a particular type block</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Datatype B_Tree_contour;// name of the mpi structure object</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MPI_Status status;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;// initialize types and displs with addresses of items</font></div><div><font class="Apple-style-span" face="Tahoma
 " size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;contour[0].front, &amp;displs[0] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;contour[0].back, &amp;displs[1] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;//consecutive types in mpi</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[0] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[1] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; for (int i = 1; i &gt;= 0; i --) &nbsp;//substracting the base address from the subsequent displacements</f
 ont></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; displs [i] -= displs [0];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;//MPI_Type_struct( no, blockcounts, displs, types,mpi_structure);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Type_struct( 2, blockcounts, displs, types, &amp;B_Tree_contour );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; //use the structure in mpi</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Type_commit( &amp;B_Tree_contour );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; // send the mpi structure</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Recv(&amp;contour, modules
 _N, B_Tree_contour, proc, tag, MPI_COMM_WORLD, &amp;status);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; return 1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">/*struct Node</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int id,parent,left,right;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;int rotate,flip;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int isleaf(){ return (left==NIL &amp;&amp; right==NIL); }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">};*/</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-styl
 e-span" face="Tahoma" size="2">// A function for defining a structure for MPI to distribute the node/state object through out the processes</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">int B_Tree::sendNode(int proc, int tag) {</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;int blockcounts[6] = {1,1,1,1,1,1};//count of the blocks of the subsequent type</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Datatype types[6];//number of the types used in the mpi struct</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Aint &nbsp; &nbsp; displs[6];//record of the displacement from the beginning of a particular type block</font></div><div><font class="Apple-style-span" face="Ta
 homa" size="2">&nbsp; &nbsp; &nbsp;MPI_Datatype B_Tree_node;// name of the mpi structure object</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;// initialize types and displs with addresses of items</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;nodes[0].id, &amp;displs[0] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;nodes[0].parent, &amp;displs[1] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;nodes[0].left, &amp;displs[2] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;nodes[0].right, &amp;displs[3] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address
 ( &amp;nodes[0].rotate, &amp;displs[4] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;nodes[0].flip, &amp;displs[5] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;//consecutive types in mpi</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[0] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[1] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[2] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;types[3] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[4] = MPI_INT ;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[5] = MPI_INT ;</font></div>
 <div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; for (int i = 5; i &gt;= 0; i --) &nbsp;//substracting the base address from the subsequent displacements</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; displs [i] -= displs [0];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;//MPI_Type_struct( no, blockcounts, displs, types,mpi_structure);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Type_struct( 6, blockcounts, displs, types, &amp;B_Tree_node );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; //use the structure in mpi</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Type_commit( &amp;B_Tree_node );</font></div><div><font class="Apple-style-span" face
 ="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; // send the mpi structure</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Send(&amp;nodes[0],modules_N, B_Tree_node, proc, tag, MPI_COMM_WORLD);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; return 1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// A function for defining a structure for MPI to collect the node/state object through out the processes</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">int B_Tree::receiveNode(int proc, int tag) {</font
 ></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int blockcounts[6] = {1,1,1,1,1,1};//count of the blocks of the subsequent type</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Datatype types[6];//number of the types used in the mpi struct</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Aint &nbsp; &nbsp; displs[6];//record of the displacement from the beginning of a particular type block</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Datatype B_Tree_node;// name of the mpi structure object</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MPI_Status status;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;// initialize types and disp
 ls with addresses of items</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;nodes[0].id, &amp;displs[0] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;nodes[0].parent, &amp;displs[1] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;nodes[0].left, &amp;displs[2] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;MPI_Address( &amp;nodes[0].right, &amp;displs[3] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;nodes[0].rotate, &amp;displs[4] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Address( &amp;nodes[0].flip, &amp;displs[5] );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;//consecu
 tive types in mpi</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[0] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[1] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[2] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;types[3] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[4] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;types[5] = MPI_INT;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; for (int i = 5; i &gt;= 0; i --) &nbsp;//substracting the base address from the subsequent displacements</font></div><div><font class="Ap
 ple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; displs [i] -= displs [0];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;//MPI_Type_struct( no, blockcounts, displs, types,mpi_structure);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Type_struct( 6, blockcounts, displs, types, &amp;B_Tree_node );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; //use the structure in mpi</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI_Type_commit( &amp;B_Tree_node );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; // recieve the mpi structure</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&
 nbsp; &nbsp; &nbsp; &nbsp;MPI_Recv(&amp;nodes[0],modules_N, B_Tree_node, proc, tag, MPI_COMM_WORLD, &amp;status);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; return 1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//--------------------------btree.cpp-------------------------------------//</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// Project: B*-trees floorplanning</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// Advisor: Yao-Wen Chang &nbsp;&lt;ywchang@cis.nctu.edu.tw&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// Authors: Jer-Ming Hsu &nbsp; &lt;barz@cis.nctu.edu.tw&gt;</font></div><div><font class="Appl
 e-style-span" face="Tahoma" size="2">// <span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp; &nbsp;Hsun-Cheng Lee &lt;gis88526@cis.nctu.edu.tw&gt;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// Sponsor: Arcadia Inc.</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// Date: &nbsp; &nbsp;7/19/2000 ~</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">float rotate_rate = 0.3;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">float sw
 ap_rate = 0.5;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; Initialization</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void B_Tree::clear(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; // initial contour value</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; contour_root = NIL;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; FPlan::clear();</font></div><div><font class="Apple-styl
 e-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void B_Tree::init(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; // initialize contour structure</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; contour.resize(modules_N);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; // initialize b*tree by complete binary tree</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; nodes.resize(modules_N);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; nodes_root=0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(int i=
 0; i &lt; modules_N; i++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; nodes[i].id = i;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; nodes[i].parent = (i+1)/2-1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; nodes[i].left &nbsp; = (2*i+1 &lt; modules_N ? 2*i+1 : NIL);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; nodes[i].right &nbsp;= (2*i+2 &lt; modules_N ? 2*i+2 : NIL);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; nodes[0].parent = NIL;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; best_sol.clear();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; last_sol.clear();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; cle
 ar();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; normalize_cost(10);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; Testing, Debuging tools</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">bool B_Tree::legal(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int num=0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2
 ">&nbsp; return legal_tree(NIL,nodes_root,num);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">bool B_Tree::legal_tree(int p,int n,int &amp;num){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; num++;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(nodes[n].parent!=p) return false;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(nodes[n].left != NIL)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(legal_tree(n,nodes[n].left,num) != true) return false;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(nodes[n].right != NIL)</font></div><div><font class="Apple-style-sp
 an" face="Tahoma" size="2">&nbsp; &nbsp; if(legal_tree(n,nodes[n].right,num) != true) return false;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(p==NIL) // root</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; return (num==modules_N);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; return true;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void B_Tree::testing(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int p,n;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; Solution E;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><
 font class="Apple-style-span" face="Tahoma" size="2">&nbsp; do{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; n = rand()%modules_N;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; p = rand()%modules_N;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; while(n==nodes_root)<span class="Apple-tab-span" style="white-space:pre">                </span>// n is not root</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; n = rand()%modules_N;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; while(n==p||nodes[n].parent==p||nodes[p].parent==n)<span class="Apple-tab-span" style="white-space:pre">        </span>// n != p &amp; n.parent != p</font></div><div><font class="Appl
 e-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; p = rand()%modules_N;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; Node &amp;node = nodes[n];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; Node &amp;parent = nodes[p];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; get_solution(E);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; swap_node(parent,node);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }while(legal());</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; cout &lt;&lt; "p=" &lt;&lt; p &lt;&lt; ", n=" &lt;&lt; n &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size
 ="2">&nbsp; recover(E);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; show_tree();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; cout &lt;&lt; "\n &nbsp;p=" &lt;&lt; p &lt;&lt; ", n=" &lt;&lt; n &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; swap_node(nodes[p],nodes[n]);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; show_tree();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void B_Tree::show_tree(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; cout &lt;&lt; "root: " &lt;&lt; nodes_root &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(int i=0; i &lt; modules_N; i++){</font></div><div><f
 ont class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; cout &lt;&lt; nodes[i].id &lt;&lt; ": ";</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; cout &lt;&lt; nodes[i].left &lt;&lt; " ";</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; cout &lt;&lt; nodes[i].parent &lt;&lt; " ";</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; cout &lt;&lt; nodes[i].right &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; Placement modules</font></div><div><fo
 nt class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void B_Tree::packing(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; stack&lt;int&gt; S;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; clear();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int p = nodes_root;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; place_module(p,NIL);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; Node &amp;n = nodes[p];</font></div><div><font class="Apple-style-span" face=
 "Tahoma" size="2">&nbsp; if(n.right != NIL) &nbsp; &nbsp; &nbsp;S.push(n.right);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(n.left &nbsp;!= NIL) &nbsp; &nbsp; &nbsp;S.push(n.left);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; // inorder traverse</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; while(!S.empty()){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; p = S.top();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; S.pop();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; Node &amp;n = nodes[p];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; assert(n.parent != NIL);</font></div>
 <div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; bool is_left = (nodes[n.parent].left == n.id);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; place_module(p,n.parent,is_left);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(n.right != NIL) &nbsp; &nbsp; &nbsp;S.push(n.right);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(n.left &nbsp;!= NIL) &nbsp; &nbsp; &nbsp;S.push(n.left);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; // compute Width, Height</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; double max_x=-1,max_y=-1;</font></div><div><font cl
 ass="Apple-style-span" face="Tahoma" size="2">&nbsp; for(int p= contour_root; p != NIL; p=contour[p].front){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; max_x = max(max_x,double(modules_info[p].rx)); &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; max_y = max(max_y,double(modules_info[p].ry));</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; Width &nbsp;= max_x;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; Height = max_y;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; Area &nbsp; = Height*Width;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; 
 FPlan::packing(); <span class="Apple-tab-span" style="white-space:pre">        </span>// for wirelength &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// is_left: default is true</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">int B_Tree::place_module(int mod,int abut,bool is_left){ //this routine can be parallelized</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;B_Tree obj;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; obj.init();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(Size&gt;1)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;if(rank==0)</font></div><div><font class="Appl
 e-style-span" face="Tahoma" size="2">{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">        </span>for(int i=0; i&lt;modules_N; i++)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; <span class="Apple-tab-span" style="white-space:pre">        </span>{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.nodes[i].id=nodes[i].id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; obj.nodes[i].parent=nodes[i].parent;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; obj.nodes[i].left=nodes[i].left;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; obj.nodes[i].right=nodes[i].right;</font></div><div><font class="Apple-style-span" face="Tahoma" siz
 e="2">&nbsp; &nbsp; &nbsp; obj.nodes[i].flip=nodes[i].flip;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; <span class="Apple-tab-span" style="white-space:pre">                </span> obj.contour[i].front=contour[i].front;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.contour[i].back=contour[i].back;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="Apple-tab-span" style="white-space:pre">        </span>obj.modules[i].id=modules[i].id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules[i].name[20]=modules[i].name[20];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules[i].width=modules[i].width;</font></div><div><font class=
 "Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules[i].height=modules[i].height;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules[i].x=modules[i].x;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules[i].y=modules[i].y;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules[i].area=modules[i].area;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules[i].pins=modules[i].pins;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.modules[i].type=modules[i].type;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">                </span>obj.modules_info[i].
 rotate=modules_info[i].rotate;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules_info[i].flip=modules_info[i].flip;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules_info[i].x=modules_info[i].x;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules_info[i].y=modules_info[i].y;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; obj. modules_info[i].rx=modules_info[i].rx;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules_info[i].ry=modules_info[i].ry;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.contour_root=contour_root;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &
 nbsp; &nbsp; &nbsp; &nbsp;obj.nodes_root=nodes_root;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; <span class="Apple-tab-span" style="white-space:pre">        </span>for(int i=1; i&lt;Size; i++)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; <span class="Apple-tab-span" style="white-space:pre">        </span>{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.sendNode(i,0);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.sendcontour(i, 20);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.sendModule_Info(i, 30);</font></div><div><fon
 t class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.sendModule(i, 40);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; <span class="Apple-tab-span" style="white-space:pre">        </span>}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; for(int i=1; i&lt;Size; i++)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; <span class="Apple-tab-span" style="white-space:pre">        </span>{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; 
 <span class="Apple-tab-span" style="white-space:pre">        </span>obj.receiveNode(i, 0);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; obj.receivecontour(i, 20);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; <span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;obj.receiveModule_Info(i, 30);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; <span class="Apple-tab-span" style="white-space:pre">        </span> <span class="Apple-tab-span" style="white-space:pre">        </span>obj.receiveModule(i,40);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for(int j=((i-1)*(modules_N/Size));j&lt;((i)*(modules_N/Size));j++)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; <span class="Apple-tab-span" style="white-space:p
 re">                        </span>{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B_Tree(obj,j);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">                </span>}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;return 0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">if(rank!=0)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">{</font></div
 ><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.receiveNode(0, 0);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><span class="Apple-tab-span" style="white-space:pre">                </span> <span class="Apple-tab-span" style="white-space:pre">        </span>obj.receivecontour(0, 20);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; <span class="Apple-tab-span" style="white-space:pre">                </span>obj.receiveModule_Info(0, 30);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; obj.receiveModule(0,40);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; <span class="Apple-tab-span" style="white-space:pre">                </span> /* &nbsp; Modules modules; &nbsp; &nbsp; &nbsp; &nbsp; 
 &nbsp; //dynamic array which store modules</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">                </span> Module &nbsp;root_module; &nbsp; &nbsp; &nbsp; //for storing root node</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">                </span> Modules_Info modules_info; */</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">        </span> <span class="Apple-tab-span" style="white-space:pre">        </span>for(int i=((rank-1)*(modules_N/Size));i&lt;((rank)*(modules_N/Size));i++)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">                </span> {</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-spa
 n" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B_Tree(obj,i);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">                </span> }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; Module_Info &amp;mod_mf = modules_info[mod];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; mod_mf.rotate &nbsp; &nbsp; &nbsp; = nodes[mod].rotate;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; mod_mf.flip &nbsp; &nbsp; &nbsp; &nbsp; = nodes[mod].flip;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int w = &nbsp;modules[mod].width;</font></div><div><font class="App
 le-style-span" face="Tahoma" size="2">&nbsp; int h = &nbsp;modules[mod].height;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(nodes[mod].rotate)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; swap(w,h);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(abut==NIL){<span class="Apple-tab-span" style="white-space:pre">        </span>// root node</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; contour_root = mod;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; contour[mod].back = NIL;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; contour[mod].front = NIL;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod_mf.x &nbsp;= mod_mf.y = 0;</font></div><div><font class=
 "Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod_mf.rx = w, mod_mf.ry = h;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; return 0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int p; &nbsp; // trace contour from p</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(is_left){<span class="Apple-tab-span" style="white-space:pre">        </span>// left</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int abut_width = (nodes[abut].rotate ? modules[abut].height :</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;modules[abut].width);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod_mf.x &nbsp;= modules_info[abut].x + abut_width;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod_mf.rx = mod_mf.x + w;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; p = contour[abut].front;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; contour[abut].front = mod;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; contour[mod].back = abut;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(p==NIL){ &nbsp;// no obstacle in X axis</font></div><div><font class="Apple-
 style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; mod_mf.y = 0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; mod_mf.ry = h;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; contour[mod].front = NIL;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; return 0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }else{<span class="Apple-tab-span" style="white-space:pre">        </span>// upper</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod_mf.x = modules_info[abut].x;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod_mf.rx = mod_mf.x + w;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; p = abut;</font></div><div><font clas
 s="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int n=contour[abut].back;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(n==NIL)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; { // i.e, mod_mf.x==0</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; contour_root = mod;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; contour[mod].back = NIL;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; else{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; contour[n].front = mod;</font></div><div><font clas
 s="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; contour[mod].back = n;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int min_y = INT_MIN;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int bx,by;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; assert(p!=NIL);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(; p!=NIL ; p=contour[p].front)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; {</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; bx = mod
 ules_info[p].rx;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; by = modules_info[p].ry;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; min_y = max(min_y, by);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(bx &gt;= mod_mf.rx){ <span class="Apple-tab-span" style="white-space:pre">        </span>// update contour</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; mod_mf.y = min_y;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; mod_mf.ry = mod_mf.y + h;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; if(bx &gt; mod_mf.rx){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; contour[mod].front = p;</font></div><div><font 
 class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; contour[p].back = mod;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; }else{ <span class="Apple-tab-span" style="white-space:pre">                        </span>// bx==mod_mf.rx</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; int n= contour[p].front;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; contour[mod].front = n;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; if(n!=NIL)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; contour[n].back = mod;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; break;</font></div><div><font class="Ap
 ple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(p==NIL){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod_mf.y &nbsp;= (min_y==INT_MIN? 0 : min_y);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod_mf.ry = mod_mf.y + h;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; contour[mod].front = NIL;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">////////////////////////////////////////////////////////////////////////////////</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;<span class="Apple-tab-spa
 n" style="white-space:pre">                </span> <span class="Apple-tab-span" style="white-space:pre">                </span>for(int i=((rank-1)*(modules_N/Size));i&lt;((rank)*(modules_N/Size));i++)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; <span class="Apple-tab-span" style="white-space:pre">                        </span>{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><span class="Apple-tab-span" style="white-space:pre">                </span>obj.nodes[i].id=nodes[i].id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; obj.nodes[i].parent=nodes[i].parent;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; obj.nodes[i].left=nodes[i].left;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; obj.nodes[i].right=nodes[i].right;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; obj.nodes[i].flip=nodes[i].flip
 ;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; <span class="Apple-tab-span" style="white-space:pre">                </span> obj.contour[i].front=contour[i].front;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.contour[i].back=contour[i].back;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="Apple-tab-span" style="white-space:pre">        </span>obj.modules[i].id=modules[i].id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules[i].name[20]=modules[i].name[20];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules[i].width=modules[i].width;</font></div
 ><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules[i].height=modules[i].height;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules[i].x=modules[i].x;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules[i].y=modules[i].y;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules[i].area=modules[i].area;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules[i].pins=modules[i].pins;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.modules[i].type=modules[i].type;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">                </span>ob
 j.modules_info[i].rotate=modules_info[i].rotate;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules_info[i].flip=modules_info[i].flip;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules_info[i].x=modules_info[i].x;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules_info[i].y=modules_info[i].y;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; obj. modules_info[i].rx=modules_info[i].rx;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.modules_info[i].ry=modules_info[i].ry;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.contour_root=contour_root;</font></div><div><font class="Apple-style-span" face="Tahoma"
  size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.nodes_root=nodes_root;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">////////////////////////////////////////////////////////////////////////////////</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">        </span> obj.sendNode(0, 0);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.sendcontour(0, 20);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.sendModule_Info(0, 30);</font></div><div><font class="Apple-style-span" face="Tah
 oma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.sendModule(0, 40);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return 0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;else {</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; Module_Info &amp;mod_mf = modules_info[mod];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; mod_mf.rotate &nbsp; &nbsp; &nbsp; = nodes[mod].rotate;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; mod_mf.flip &nbsp; &nbsp; &nbsp; &nbsp; = nodes[mod].flip;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int w = &nbsp;modules[mod].width;</font></div><div><font class="Apple-style-span" face="Tah
 oma" size="2">&nbsp; int h = &nbsp;modules[mod].height;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(nodes[mod].rotate)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; swap(w,h);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(abut==NIL){<span class="Apple-tab-span" style="white-space:pre">        </span>// root node</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; contour_root = mod;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; contour[mod].back = NIL;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; contour[mod].front = NIL;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod_mf.x &nbsp;= mod_mf.y = 0;</font></div><div><font class="Apple-style-span" face=
 "Tahoma" size="2">&nbsp; &nbsp; mod_mf.rx = w, mod_mf.ry = h;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; return 0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int p; &nbsp; // trace contour from p</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(is_left){<span class="Apple-tab-span" style="white-space:pre">        </span>// left</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int abut_width = (nodes[abut].rotate ? modules[abut].height :</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &n
 bsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;modules[abut].width);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod_mf.x &nbsp;= modules_info[abut].x + abut_width;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod_mf.rx = mod_mf.x + w;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; p = contour[abut].front;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; contour[abut].front = mod;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; contour[mod].back = abut;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(p==NIL){ &nbsp;// no obstacle in X axis</font></div><div><font class="Apple-style-span" face="Tahoma
 " size="2">&nbsp; &nbsp; &nbsp; mod_mf.y = 0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; mod_mf.ry = h;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; contour[mod].front = NIL;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; return 0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }else{<span class="Apple-tab-span" style="white-space:pre">        </span>// upper</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod_mf.x = modules_info[abut].x;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod_mf.rx = mod_mf.x + w;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; p = abut;</font></div><div><font class="Apple-style-span" fac
 e="Tahoma" size="2">&nbsp; &nbsp; &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int n=contour[abut].back;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(n==NIL){ // i.e, mod_mf.x==0</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; contour_root = mod;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; contour[mod].back = NIL;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; else{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; contour[n].front = mod;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; contour[mod].back = n;</font>
 </div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int min_y = INT_MIN;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int bx,by;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; assert(p!=NIL);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(; p!=NIL ; p=contour[p].front)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; {</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; bx = modules_info[p].rx;</font></div><div><font class="Apple-style-span" face="Tahoma" size="
 2">&nbsp; &nbsp; by = modules_info[p].ry;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; min_y = max(min_y, by);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(bx &gt;= mod_mf.rx){ <span class="Apple-tab-span" style="white-space:pre">        </span>// update contour</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; mod_mf.y = min_y;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; mod_mf.ry = mod_mf.y + h;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; if(bx &gt; mod_mf.rx){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; contour[mod].front = p;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &
 nbsp; &nbsp; contour[p].back = mod;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; }else{ <span class="Apple-tab-span" style="white-space:pre">                        </span>// bx==mod_mf.rx</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; int n= contour[p].front;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; contour[mod].front = n;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; if(n!=NIL)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; contour[n].back = mod;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; break; &nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbs
 p; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(p==NIL){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod_mf.y &nbsp;= (min_y==INT_MIN? 0 : min_y);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; mod_mf.ry = mod_mf.y + h;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; contour[mod].front = NIL;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;return 0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" fac
 e="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; Manipulate B*Tree auxilary procedure</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void B_Tree::wire_nodes(int parent,int child,DIR edge){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; assert(parent!=NIL);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; (edge==LEFT? nodes[parent].left: nodes[parent].right) = child;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(child!=NIL) nodes[child]
 .parent = nodes[parent].id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">int B_Tree::child(int node,DIR d){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; assert(node!=NIL);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; return (d==LEFT? nodes[node].left:nodes[node].right); &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; Simulated Annea
 ling Temporal Solution</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void B_Tree::get_solution(Solution &amp;sol){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; sol.nodes_root = nodes_root;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; sol.nodes = nodes;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; sol.cost = getCost();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void B_Tree::keep_sol(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbs
 p; get_solution(last_sol);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void B_Tree::keep_best(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; get_solution(best_sol);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void B_Tree::recover(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; recover(last_sol);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; // recover_partial();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font c
 lass="Apple-style-span" face="Tahoma" size="2">void B_Tree::recover_best(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; recover(best_sol);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void B_Tree::recover(Solution &amp;sol){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; nodes_root = sol.nodes_root;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; nodes = sol.nodes;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void B_Tree::recover_partial(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(changed_root != NI
 L)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; nodes_root = changed_root;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(int i=0; i &lt; changed_nodes.size(); i++){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; Node &amp;n = changed_nodes[i];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; nodes[n.id] = n;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void B_Tree::add_changed_nodes(int n){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(n==NIL) return;</font></d
 iv><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; for(int i=0; i &lt; changed_nodes.size(); i++)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(changed_nodes[i].id == n)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><span class="Apple-tab-span" style="white-space:pre">        </span>return;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; changed_nodes.push_back(nodes[n]);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; Simulated Annealing Permutation Operations</font></
 div><div><font class="Apple-style-span" face="Tahoma" size="2">//---------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void B_Tree::perturb(){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int p,n;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; n = rand()%modules_N;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp;changed_nodes.clear();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp;changed_root = NIL;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahom
 a" size="2">&nbsp; if(rotate_rate &gt; rand_01()){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; &nbsp;changed_nodes.push_back(nodes[n]);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; nodes[n].rotate = !nodes[n].rotate;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(rand_bool()) nodes[n].flip = !nodes[n].flip;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; else{ <span class="Apple-tab-span" style="white-space:pre">        </span></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(swap_rate &gt;rand_01()){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; do{</font></div><div><font class="Apple-style-span" fa
 ce="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; p = rand()%modules_N;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; }while(n==p||nodes[n].parent==p||nodes[p].parent==n);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; &nbsp; &nbsp;changed_nodes.push_back(nodes[p]);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; &nbsp; &nbsp;changed_nodes.push_back(nodes[n]);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; swap_node(nodes[p],nodes[n]);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }else{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&
 nbsp; &nbsp; &nbsp; do{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; p = rand()%modules_N;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; }while(n==p);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; &nbsp; &nbsp;changed_nodes.push_back(nodes[p]);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; &nbsp; &nbsp;changed_nodes.push_back(nodes[n]);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; delete_node(nodes[n]);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; insert_node(nodes[p],nodes[n]);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</f
 ont></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void B_Tree::swap_node(Node &amp;n1, Node &amp;n2){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(n1.left!=NIL){ &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; //add_changed_nodes(n1.left);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; nodes[n1.left].parent &nbsp;= n2.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(n1.right!=NIL){</font></div><div><font class="Apple-style-span
 " face="Tahoma" size="2">&nbsp; &nbsp; //add_changed_nodes(n1.right);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; nodes[n1.right].parent = n2.id; &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(n2.left!=NIL){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; //add_changed_nodes(n2.left);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; nodes[n2.left].parent &nbsp;= n1.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(n2.right!=NIL){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; //add_changed_nodes(n2.right);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; node
 s[n2.right].parent = n1.id; &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(n1.parent != NIL){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; //add_changed_nodes(n1.parent);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(nodes[n1.parent].left==n1.id)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;nodes[n1.parent].left &nbsp;= n2.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; else</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;nodes[n1.parent].right = n2.id;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }else{</font></div><div>
 <font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; changed_root = n1.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; nodes_root = n2.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(n2.parent != NIL){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; //add_changed_nodes(n2.parent);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(nodes[n2.parent].left==n2.id)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;nodes[n2.parent].left &nbsp;= n1.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; else</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; 
 &nbsp; &nbsp; &nbsp;nodes[n2.parent].right = n1.id;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }else{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; &nbsp;changed_root = n2.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; nodes_root = n1.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; swap(n1.left,n2.left);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; swap(n1.right,n2.right);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; swap(n1.parent,n2.parent);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><
 font class="Apple-style-span" face="Tahoma" size="2">void B_Tree::insert_node(Node &amp;parent, Node &amp;node){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; node.parent = parent.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; bool edge = rand_bool();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(edge){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; //add_changed_nodes(parent.left);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; node.left &nbsp;= parent.left;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; node.right = NIL;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(parent.left!=NIL)</font></div><div><font class="Apple-style-span" face="Tahoma" 
 size="2">&nbsp; &nbsp; &nbsp; nodes[parent.left].parent = node.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; parent.left = node.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }else{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; //add_changed_nodes(parent.right);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; node.left &nbsp;= NIL;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; node.right = parent.right;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(parent.right!=NIL)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; nodes[parent.right].parent = node.id;<
 /font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; parent.right = node.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void B_Tree::delete_node(Node &amp;node){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int child &nbsp; &nbsp;= NIL;<span class="Apple-tab-span" style="white-space:pre">        </span>// pull which child</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int subchild = NIL; &nbsp; // child's subtree</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int subparent= NIL;&nbsp;</font></div><div><font class="A
 pple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(!node.isleaf()){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; bool left= rand_bool();<span class="Apple-tab-span" style="white-space:pre">                        </span>// choose a child to pull up</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(node.left ==NIL) left=false;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(node.right==NIL) left=true;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; //add_changed_nodes(node.left);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; //add_changed_nodes(node.right);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font cla
 ss="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(left){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; child = node.left;<span class="Apple-tab-span" style="white-space:pre">                        </span>// child will never be NIL</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; if(node.right!=NIL){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; subchild &nbsp;= nodes[child].right;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; subparent = node.right;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; nodes[node.right].parent = child;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; nodes[child].right = node.right;<span class="Apple-tab-span" style="white-space:pre">        </span>// abut with node
 's another child</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; else{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; child = node.right;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; if(node.left!=NIL){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; subchild &nbsp;= nodes[child].left;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; subparent = node.left;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><span class="Apple-tab-span" style="white-space:pre">        </span>nodes[node.left].parent = child;</font></div><div><font class="Apple-style-span" face="
 Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; nodes[child].left = node.left;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; //add_changed_nodes(subchild);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; nodes[child].parent = node.parent;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(node.parent == NIL){<span class="Apple-tab-span" style="white-space:pre">                        </span>// root</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">// &nbsp; &nbsp;changed_root = nodes_root;</font></div><div><font class="Apple-style-span" face="
 Tahoma" size="2">&nbsp; &nbsp; nodes_root = child;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }else{<span class="Apple-tab-span" style="white-space:pre">                                        </span>// let parent connect to child</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; //add_changed_nodes(node.parent);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; if(node.id == nodes[node.parent].left)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; nodes[node.parent].left &nbsp;= child;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; else</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; nodes[node.parent].right = child;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div>
 <div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; // place subtree</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(subchild != NIL){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; Node &amp;sc = nodes[subchild];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; assert(subparent != NIL);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; while(1){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; Node &amp;p = nodes[subparent];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; if(p.left==NIL || p.right==NIL){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp
 ; &nbsp; &nbsp; //add_changed_nodes(p.id);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><span class="Apple-tab-span" style="white-space:pre">        </span>sc.parent = p.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; if(p.left==NIL) p.left = sc.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; else p.right = sc.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; break;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; }else{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><span class="Apple-tab-span" style="white-space:pre">        </span>subparent = (rand_bool() ? p.left : p.right);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; 
 &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">bool B_Tree::delete_node2(Node &amp;node,DIR pull){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; DIR npull = !pull;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int p = node.parent;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int n= node.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int c= child(n,pull
 );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int cn=child(n,npull);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; assert(n!= nodes_root); // not root;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; DIR p2c = (nodes[p].left==n ? LEFT:RIGHT);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(c==NIL){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; wire_nodes(p,cn,p2c);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; return (cn!=NIL); &nbsp; // folding</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }else{</font></div><div><
 font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; wire_nodes(p,c,p2c);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; while(c!=NIL){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int k=child(c,npull);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; wire_nodes(c,cn ,npull);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; cn= k;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; n= c;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; c= child(c,pull);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2
 "><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(cn != NIL){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; wire_nodes(n,cn,pull);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; return true;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }else&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; return false;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">/*</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;Insert node into parent's left or right subtree according by "edge".</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;Push node into parent's subtree in
  &nbsp;"push" direction.</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;if "fold" is true, then fold the leaf.</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;(for the boundary condition of "delete" operation)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;delete &lt;==&gt; insert are permutating operations that can be recoved.</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">*/</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">void B_Tree::insert_node2(Node &amp;parent,Node &amp;node,</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbs
 p; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DIR edge,DIR push,bool fold){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; DIR npush = !push;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int p= parent.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int n= node.id;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; int c= child(p,edge);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; wire_nodes(p,n,edge);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; wire_nodes(n,c,push);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; while(c!=NIL){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nb
 sp; &nbsp; wire_nodes(n,child(c,npush) ,npush);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; n= c;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; c= child(c,push);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; wire_nodes(n,NIL,npush);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; if(fold){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; wire_nodes(nodes[n].parent,NIL,push);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; wire_nodes(nodes[n].parent,n,npush);&nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; }</font></div><div><font class="Apple-style-span" face="Tahoma" size="2
 ">}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">int main(int argc,char **argv)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">char processor_name[ MPI_MAX_PROCESSOR_NAME ];</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int namelen;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; MPI::Init(argc, argv);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int rank = MPI::COMM_WORLD.Get_rank();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; int size = MPI::COMM_WORLD.Get_size();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;MPI_Get_processor_name( processor_name, &amp
 ;namelen );</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;char filename[80],outfile[80]="";</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;int times=400, local=7;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;float init_temp=0.9, term_temp=0.1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;float alpha=1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;if(argc&lt;=1){</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;printf("Usage: btree &lt;filename&gt; [times=%d] [hill_climb_stage=%d]\n",</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ti
 mes, local);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;printf(" &nbsp; &nbsp; &nbsp; &nbsp;[avg_ratio=%.1f] [cost_ratio=%f]\n",avg_ratio,alpha);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;printf(" &nbsp; &nbsp; &nbsp; &nbsp;[lamda=%.2f] [term-temp=%.2f]\n",lamda,term_temp);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;printf(" &nbsp; &nbsp; &nbsp; &nbsp;[output]\n");</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;return 0;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;}else{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;int argi=1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;if(argi &lt; argc) strcpy(filename, argv[argi++]);</font></div><div><font class="Apple-sty
 le-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;if(argi &lt; argc) times=atoi(argv[argi++]);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;if(argi &lt; argc) local=atoi(argv[argi++]);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;if(argi &lt; argc) avg_ratio=atof(argv[argi++]);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;if(argi &lt; argc) alpha=atof(argv[argi++]);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;if(argi &lt; argc) lamda=atof(argv[argi++]);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;if(argi &lt; argc) term_temp=atof(argv[argi++]);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;if(argi &lt; argc) strcpy(outfile, argv[argi++]);</font></div><div><font class="Apple-style-span" face="Tahoma" s
 ize="2">&nbsp; &nbsp;}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;try{</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;double time = seconds();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;B_Tree fp(alpha);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;fp.read(filename);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;//fp.show_modules();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;fp.init();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;double last_time = &nbsp;SA_Floorplan(fp, times, local, term_temp);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;//
 Random_Floorplan(fp,times);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;fp.list_information();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;{ // log performance and quality</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;if(strlen(outfile)==0)</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;strcpy(outfile,strcat(filename,".res"));</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;last_time = last_time - time;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;printf("CPU time &nbsp; &nbsp; &nbsp; = %.2f\n",seconds()-time);</font></div><
 div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;printf("Last CPU time &nbsp;= %.2f\n",last_time);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;FILE *fs= fopen(outfile,"a+");</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;fprintf(fs,"CPU= %.2f, Cost= %.6f, Area= %.0f, Wire= %.0f, Dead=%.4f ",</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;last_time, float(fp.getCost()), &nbsp;float(fp.getArea()),</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; float(fp.getWireLength()), float(fp.getDeadSpace()));</font></div><d
 iv><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;fprintf(fs," :%d %d %.0f \n", times, local, avg_ratio);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp;fclose(fs);</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp;}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;}catch(...){}</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MPI::Finalize();</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">&nbsp; &nbsp;return 1;</font></div><div><font class="Apple-style-span" face="Tahoma" size="2">}</font></div></div>                                               </div></body>
</html>