From 3fa233a0157e0a439c99428f03db33c8f3487fda Mon Sep 17 00:00:00 2001
From: bmccolm <briannamccolm@gmail.com>
Date: Tue, 9 Jan 2024 20:11:53 -0800
Subject: [PATCH] test of move to python3, hw1 ex appear to work

---
 cnn_mapping/__init__.py                       |  10 +-
 cnn_mapping/__init__.pyc                      | Bin 0 -> 696 bytes
 .../__pycache__/__init__.cpython-36.pyc       | Bin 0 -> 563 bytes
 .../__pycache__/buffer_enum.cpython-36.pyc    | Bin 0 -> 294 bytes
 cnn_mapping/__pycache__/cache.cpython-36.pyc  | Bin 0 -> 1505 bytes
 .../__pycache__/cost_model.cpython-36.pyc     | Bin 0 -> 26101 bytes
 .../__pycache__/extract_input.cpython-36.pyc  | Bin 0 -> 3320 bytes
 cnn_mapping/__pycache__/layer.cpython-36.pyc  | Bin 0 -> 1936 bytes
 .../__pycache__/loop_enum.cpython-36.pyc      | Bin 0 -> 639 bytes
 .../__pycache__/mapping_point.cpython-36.pyc  | Bin 0 -> 3979 bytes
 .../mapping_point_generator.cpython-36.pyc    | Bin 0 -> 20273 bytes
 .../__pycache__/optimizer.cpython-36.pyc      | Bin 0 -> 1442 bytes
 .../__pycache__/resource.cpython-36.pyc       | Bin 0 -> 6276 bytes
 .../__pycache__/schedule.cpython-36.pyc       | Bin 0 -> 1529 bytes
 cnn_mapping/__pycache__/utils.cpython-36.pyc  | Bin 0 -> 759 bytes
 cnn_mapping/buffer_enum.pyc                   | Bin 0 -> 329 bytes
 cnn_mapping/cache.pyc                         | Bin 0 -> 1675 bytes
 cnn_mapping/cost_model.py                     | 111 +++++++--------
 cnn_mapping/cost_model.pyc                    | Bin 0 -> 30426 bytes
 cnn_mapping/extract_input.py                  |   4 +-
 cnn_mapping/extract_input.pyc                 | Bin 0 -> 3774 bytes
 cnn_mapping/layer.pyc                         | Bin 0 -> 2367 bytes
 cnn_mapping/loop_enum.pyc                     | Bin 0 -> 696 bytes
 cnn_mapping/mapping_point.pyc                 | Bin 0 -> 4308 bytes
 cnn_mapping/mapping_point_generator.py        | 126 +++++++++---------
 cnn_mapping/mapping_point_generator.pyc       | Bin 0 -> 25156 bytes
 cnn_mapping/optimizer.py                      |  22 +--
 cnn_mapping/optimizer.pyc                     | Bin 0 -> 1752 bytes
 cnn_mapping/resource.py                       |   9 +-
 cnn_mapping/resource.pyc                      | Bin 0 -> 6605 bytes
 cnn_mapping/schedule.py                       |   6 +-
 cnn_mapping/schedule.pyc                      | Bin 0 -> 1818 bytes
 cnn_mapping/utils.py                          |  16 +--
 cnn_mapping/utils.pyc                         | Bin 0 -> 919 bytes
 tools/run_optimizer.py                        |  75 +++++++++--
 35 files changed, 220 insertions(+), 159 deletions(-)
 create mode 100644 cnn_mapping/__init__.pyc
 create mode 100644 cnn_mapping/__pycache__/__init__.cpython-36.pyc
 create mode 100644 cnn_mapping/__pycache__/buffer_enum.cpython-36.pyc
 create mode 100644 cnn_mapping/__pycache__/cache.cpython-36.pyc
 create mode 100644 cnn_mapping/__pycache__/cost_model.cpython-36.pyc
 create mode 100644 cnn_mapping/__pycache__/extract_input.cpython-36.pyc
 create mode 100644 cnn_mapping/__pycache__/layer.cpython-36.pyc
 create mode 100644 cnn_mapping/__pycache__/loop_enum.cpython-36.pyc
 create mode 100644 cnn_mapping/__pycache__/mapping_point.cpython-36.pyc
 create mode 100644 cnn_mapping/__pycache__/mapping_point_generator.cpython-36.pyc
 create mode 100644 cnn_mapping/__pycache__/optimizer.cpython-36.pyc
 create mode 100644 cnn_mapping/__pycache__/resource.cpython-36.pyc
 create mode 100644 cnn_mapping/__pycache__/schedule.cpython-36.pyc
 create mode 100644 cnn_mapping/__pycache__/utils.cpython-36.pyc
 create mode 100644 cnn_mapping/buffer_enum.pyc
 create mode 100644 cnn_mapping/cache.pyc
 create mode 100644 cnn_mapping/cost_model.pyc
 create mode 100644 cnn_mapping/extract_input.pyc
 create mode 100644 cnn_mapping/layer.pyc
 create mode 100644 cnn_mapping/loop_enum.pyc
 create mode 100644 cnn_mapping/mapping_point.pyc
 create mode 100644 cnn_mapping/mapping_point_generator.pyc
 create mode 100644 cnn_mapping/optimizer.pyc
 create mode 100644 cnn_mapping/resource.pyc
 create mode 100644 cnn_mapping/schedule.pyc
 create mode 100644 cnn_mapping/utils.pyc

diff --git a/cnn_mapping/__init__.py b/cnn_mapping/__init__.py
index 2d9e011..db5bff0 100644
--- a/cnn_mapping/__init__.py
+++ b/cnn_mapping/__init__.py
@@ -2,13 +2,15 @@
 cnn_mapping package
 '''
 
-from .mapping_point import MappingPoint
-from .resource import Resource
-from .layer import Layer
-from .schedule import Schedule
 from . import loop_enum as le
 from . import utils
 from . import extract_input
 from . import cost_model
 from . import mapping_point_generator
 from . import optimizer
+
+from .mapping_point import MappingPoint
+from .resource import Resource
+from .layer import Layer
+from .schedule import Schedule
+
diff --git a/cnn_mapping/__init__.pyc b/cnn_mapping/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ab65c4989a4163fe10cd529bdae4f46b521284cb
GIT binary patch
literal 696
zcmZ9JOK#gR5QayxE!&EnI6#YTv-BnrkWDv5&;ukv!0fmoRBGS|Aw@x?fTp*|HFAoc
zsl7mENCA0B;4ghYN16v`|F`AyzrR|;bmjE?Nz1>GGysw`gC+-)fz3hYkTK7|%)rh;
z&J)kUEWj2Zi^K~sORy`DtHcGEHP{m5QQ~Ff4aiO6Rpc$mZQ^z0W01#*%g84nPZA$R
z-htc^Z{U8v<(j{el)CGbt^2<14rhI>AL|2_ZALqLmarkYN!xd>?Lu-_<O=j|95g0p
zLC$skgu`3Fy?(%EG*iHu0*rIL!fv#0-;AL(J|WkHzr#@LpxUk<r(7l3+WDZYYtW?7
zZ{$rytDehJ2kdaDgPZbmHrI#NwtsNA-JcSMC5cjv(@F)-_2CDC3<%uUF!d#3|J;}1
zz62k24DeH5V#W?F5OaRx0E2?R5Csb-6me8s&Yspg@mGY^gR@wT9tU6jvRXT1E5yt1
rm*><InE{Qdhw9xKRf=ZQ2Bj|gr&!Go8Ve2iii`1INQ!)yeZF4-8X}AV

literal 0
HcmV?d00001

diff --git a/cnn_mapping/__pycache__/__init__.cpython-36.pyc b/cnn_mapping/__pycache__/__init__.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..88098638a6d30c733700e49b703d6cb9b927f6f3
GIT binary patch
literal 563
zcmY+AzfQw25XPM}Y5p{Uf<UaS9Uu}6ET}?a1%&A4#R|@;jj-d$aU{ybi|_zE2XB#;
zi5FmC;%q7ew*2|`oh{$_PV+o{`+R{*kC1orXZXk$xVmSQicnH{l`lN$(~)O+gdEVo
zaey4s&~b=7renur<cLO&BjlLIj$@I?l%|doF_9U~9H%0eTXf6uL~P3`og!xoGRvR#
zQ{FU8mTg-%%fq(h59Jcl4=kI^yde=vwG5hGq6vFbiw+@&N25z_SlzU}!9dDYXP8tK
z2y_RV*I29S#;_$cpi84P9wn+ZwXC1On(X=~>#e<pKE8ua^_l~6cvY_5rFg+tQ1t?C
zW;;W~Sfw~)1JSmRgD*gj5OiQAv@*65q0sza89K(;5bI3}omd+Rn?<MYsM{pc6SS{H
z@8ag<YhJ9Bgre_2cg4NrTnSkKoSdB;VdWS!AVjH)Kb<TXHm5d>9k=TtKF8MJ7v{Fs
NZVx5!Gw*k9_#3D^mG}Sv

literal 0
HcmV?d00001

diff --git a/cnn_mapping/__pycache__/buffer_enum.cpython-36.pyc b/cnn_mapping/__pycache__/buffer_enum.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9eaaffbe71248a4334b86fb791fb71c38eca3ba7
GIT binary patch
literal 294
zcmX|*y-ve06onlpp;e^rj2;^aVyO%)2mwQ+NTnSRix;c49f;(gC{Bj*7CZ)T!E<C~
z%F5V@>w@sr`E+z;`<$!AB76V-6b>Qu1^Pb`xI2(P2S~(_j94Tw!!l;EOjsh*CzPMP
zRoTN(*Qz7R4u<rHRu$Rb%9F+lJxE2G+U#1gtjhd?xL>~wzHW36PnYF7FR}@O&=hhf
z91sIGc{<KGmriiba8)wA1(oYD-aJ2kpl$|tPB`AvS7#I*yy`sN8zG!FRH@bV>awvA
q;(Mj_uA{<Q4rSWLzR>-tIS<W?_At(GjFW>_w<-MU=YRw!QJ5cvA5E$N

literal 0
HcmV?d00001

diff --git a/cnn_mapping/__pycache__/cache.cpython-36.pyc b/cnn_mapping/__pycache__/cache.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..921fd922a04a5c49315d870ffed83db1c513a507
GIT binary patch
literal 1505
zcmb7EO>fjZ5VoC<-EKc9P=w$Vz2ZP5=%RuEiBi7Bd+K}WZ6#y{+ilZ2$<|KzScMDQ
zKfur6U+_D8<;0aECuW@Pw(xSnk;fBz#+m1tncQAp9(?-#MLY@#`AW_Vcqflx+606o
zl4?@W5vAlMkxT~1L<WjYgHa&E9g;@hz>1{QMN%C#O5odUFi;-DwAVo>GNO`<n55w8
z?-_+Ml+iI6MKYE>SYz3T8y8&kEED@`@^p~E_*dz%GKtWcwaIP;8XhL1D#lH%Wb!7{
zjj~ByB}U0csKhj7ofpbGivYfi16Q2SVA}g2TG|p0;3PXHHErpXJ||P$gV6rB7qkpc
zLP;RJa9dFD$AS3p(jA!g0*F1*l2?Ndv?f#Xi5&qypOKnS=AurSW9zpZeP@thFMd22
z?pK8xHdYxsd|e1p>0+qV#=VW3d0E3|t+dX}P?RMvvhg@C_l6$+`uP2i!KTh_jXZ1(
zFaV4uCX;_WdF!0#WnOc>zNssbX}bl=%=~Wv_&`%?@b;9M7#2tKQw*jLJ7xjIBFvK@
z(#Q?Urr=t=QQEr5WaXZ63qEuN;ubp<3Z_vmwE0A(0jx^z8ob7wLow&cf5Y`>knoEZ
z1)(urgJ-hxE9O6E{Vq7vke~y|_7%vrq=(EVnAvXUuxGAGwllYA*%inv?xexwjxQ&y
z$Nx(G9!f2fT_N5`$|@222oP(q$PT;8LsNr=vJHt3v?|Rqyrh9yg~dgl87Pdb&VI)^
zz{|NOXa#I7Qcl8zhHSFh;XE}E$PtbRChESv$Do`=>UGwkM$C2ak+#7Mcgr>rvp+uw
zTQ;S%^FHx_v*<81dTtX>$%k<69X^CE0*=_^{;wRpHF*tvirso+#t`H_$x4~{#LvyQ
z)1JZh@e~;Z?N**xXo@<o$`{5|#>G(ms+7JkTyI>Bwc4%I$g^oKqVF2IMgDIvLIbX}
z`kmTEA5+KeWw5tPAduS?y2{o-PR@4>pRt4Bu=L8TP@KB~=S3wOjrtPjM@^<rPI{cn
zN^ow@!<FU|imND2tJrJ4UGS%Y(^qjn2w6YwFBsg}PD5ypN^2z$y!CzO;_CGQY<P=5
RUFiCoT~u3GalQ$c*iVc5P!0e9

literal 0
HcmV?d00001

diff --git a/cnn_mapping/__pycache__/cost_model.cpython-36.pyc b/cnn_mapping/__pycache__/cost_model.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..56e6bd63bb5316ffad125d5607529b31e97a1827
GIT binary patch
literal 26101
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
PFj{)F^f-RUaPRzIpw9S@

literal 0
HcmV?d00001

diff --git a/cnn_mapping/__pycache__/extract_input.cpython-36.pyc b/cnn_mapping/__pycache__/extract_input.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8c367b72904be264ddde07574d5a676d8d8be296
GIT binary patch
literal 3320
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

literal 0
HcmV?d00001

diff --git a/cnn_mapping/__pycache__/layer.cpython-36.pyc b/cnn_mapping/__pycache__/layer.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1d2a3b96ce2b3bb94451d0ee2a6261027d04daeb
GIT binary patch
literal 1936
zcmZ`)&5qkP5T+zbmSwNA*`)a?ib6nvbOj_flC~(YO^Xyk+e_g~Z@Lg#k+!svC6|<A
ztf5nPU!eECK;NRzp=(dM_SjQrM)t-@TpIjH4#^?)alY{vM@PZ$|NNDH=`r><+bbOU
zFQA%J0LfzZ6O)#-ubH%!b>+l1j2+2g%#{seN4meT$lKfteoiix4$V@f`7BS9I<Lxc
zkb;++;y~{ORPzWxvDgCtwzR;9Pd=@fD_6SGyJlBb?8zQ@?zb*EPF`7z1tFB_G%V<-
zWulXXs+Bh5fM&{kwm1tv3!zDtVVWgnsS23HU1inHLG!`fn)Y?O*14>+ZcDaj&Qw0n
z>dw9<SDmB%<$LCLme2CyEL@X=5c+W8aDUr@>HY0xzL?WTmCIEf=8I&mOn7>p)M*xN
z?_+9t7Mfb;QiUeps4y?P6GE9URB7lXkc8~e%I>iDm%ahISsDOf!L|qWB~<eVKw~vb
zu*L?o8VAsBIH1$GjU%lGtnu%%`wT3+@fuE+{?_8c8YVojGtp~$fPUix_M1Ln(69?z
z+ON3D>cMYt%7sIt*V~a#qiY(u;KPA)ZMaQuj-G~+LCiQ)ZNnYkKxNTU%P}qh;eA?;
zkJs`HFy{E~F~?^HJ3Ir}36XNJ09jx`9DQ$$(iqV{XkF>pMV3tzwA`p-rcpE6MF2H1
zjYMf5p^t#v=>ftJ;7_J+LG$l7ldM{($qM|M$@wBpt70)x>e<)Np5!IQbghaa(UY_+
z1w`yJFXs~q`|<L!^@YgGycXgfxH6vtFw5KiPOOugzGsc-w;7R!#=C7P(t`zCyc)gh
zbLceiveJ5pXcIbwoX{oo2z!J+VgDh!>I3h=G(O2OOa+QeYy}wKsaEv|#(<WP4&njz
zyEu%8>%5fJT69xK+tGG1ptu)Ee?06Wez$Nt>J}2mk=;6JVOpM-vx+Po9K(0EE|K{;
zbPYZgvq!+&(Ao?-rf7B=ITT25A?hLbC8Ql8+CYd!C07OZheG_iN{a1FPY7A1Lg?Fg
z)F3SqV<1yymDG2^vUeAZ1&tTds5guugE8da;&yPGY=<-G$FS&~4C?JNDCOf`+xzh)
zeaS}elICnx6qirZ3X)=4EBSv(^b}R`I7C%M;kV%_3Im3K(c=&`0Y(%BG*7_*LPA5=
zJna$^@s;9tV8IrJKr!|SbZT}1x(3Zc?w6Q7c;jCA7W~^l4B4G_Bbz>+2#h>Ef^B;;
zdrw?M;#($>^sk^AigIgnyrtqM{HKvcSBzZ!5jsW{>H7!|5ODv&CqmN4Pz?&+ce$<6
hGL1OxYrX3H0;ugSjx&dxwEpuhXuflHp16G+{RhJ|&=LRu

literal 0
HcmV?d00001

diff --git a/cnn_mapping/__pycache__/loop_enum.cpython-36.pyc b/cnn_mapping/__pycache__/loop_enum.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4d24a33d35af398124c858cd074fcb4af8350357
GIT binary patch
literal 639
zcma))!D`z;5QbN4*^<|BoTe|JV+^SU=^>ZU1OkCTY86T$*^7`h+eolliPegdyhZLg
z_R_cLbLg6ruQ}$_8B@2-ty<>W(a*oX&`9s6Q}OWpGoNwBp4dNEi2WH>`w0O|GVr7a
zTyhx50r=8~p&Y_Ujv$Z$gffIN2$;YQOko#hu=g0qG2jV6H=q*&c!QdN{m*Rv_WrxL
zs_Q0FrmG@%*QkZq2yIlFTz8<Nucda%M&C+sMRag+JwMz^g(`0ghuRHlqV8PNxveiD
z-*0K_OVGEq<wa(U($PV3j>gi^(LdTHYGReS93Pl0=L@mMcV}ylfb(JN0l_B>2_r&)
z==sGp)=ke7+!NZ*dwz+9F@dE3O97SwECpB!uoPe^08L}+1z|$iAxsIogc)KvpY%bR
zLY=4Sf7s<<`Q>9jblFNPDKt(y-Sj`0-KR*x%V}KHm5RGo**0EPd0y)(R_f^Z=v`@W
y{;gA5XEx4_Nvo`BN^=`;qUggdn!7$cscPu7`anNSdx-G4@4Z@_dw*B>>h2f!N0h1n

literal 0
HcmV?d00001

diff --git a/cnn_mapping/__pycache__/mapping_point.cpython-36.pyc b/cnn_mapping/__pycache__/mapping_point.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7a74f96a7244a0d326281aa0ff0a430009cf0368
GIT binary patch
literal 3979
zcmeHK-EP}96qbLIxNg#QErxEzFc9l5V!(BN+ZEjp3KZE8Anl5+13DLlAd^(gRuVmu
z%90>=%M0u=wx`&0_;zow%U$gpQlex#0dld+DKIIKN8dT;<KZV}XKk(f+uwiE{To5>
zS5Uj!aQ_5;`a@_~Fbuv8Sc5gs1J>k?Ut7Z_YyA-P+NYm&U!F`jiKQYD(GyNZEGS8%
z$wXv_WFkdo23-mm{%XP96Zq+EXm~Je0D6-(hAnoTwOISSF>JFXwtOB8m)HvHK)=kc
zu`cv0tO-6>r>oB#{0l^nngG}(a6Oe-EDm!O86h)GWPCwHgRV6#0EozFk~6M}8FNBq
zI!U<U1O})Q6NEt&oJ*vf5UCi4G&5!&Ezl^D^c`jzN7P7Vz4C~T$taIwFi!XpPx|il
zNu-QGP_&nsk;GbB6Yyj4z$Qu(o{&5fM)wIfv<P_*QRl+2?`v)_N;|a>PNXm|rMRBR
zjG<#Att00evx*D>moou_;}NG(t~n8gFbM=@(!i>|<0Q=?4$U)|gAA-g3z$l9WyTRu
zmQij|i3W!WpMkDtQ;&RxoRUnT7lJ2Qo{oT6$hhQ6=(MD7AuG(x608fyFUmzAsbr9z
zTl$Dnu5~e#%^=fA^8v9bVv%jGGag5IVtS8B@fOgK@nhrsU|=Z+GEV#}Ti((Yg@&?&
zH^kw11iNOUB>Kjsv1{&MyLa$xZ=Xo0J}@fE0#n6+AZp+qSZ0hf`^Iy+1ltKO?3?g=
z3P1fZG-r*oAPml$&^FFm&^FK7(6(3ryQ%TK*PdR-;t6ee>*)>qP*#$j-m=g2_0hvM
z3@Ee{Or*V~X<PFo9==!Mgo)5*czYJh4c=J<bQ8B`Q0>_7fm((X{&~7FmMPzWid1@I
zlu{~_bc6Hl&$sV`2Ed@<NfN0Inq^@jJ{v_JIuV+jOgmvHU|WUZU8JT1P0(I$;NR&7
zbx9eNb`*KU3wzIL7aq=nx4`R1mci%<#L_R@L8TOhb{vW$p4t6b)F9T;_uS+v1BEg<
zhz?c_%8XMO0Xr3H!ip-6>L@J~XlAc^m#)D3L=5-<TGTy<imHrclkZ+(r7P=`v%b|Z
zM2-b8R~0u;c*-*?CuWRW!^UP_Z@wX4k?lT)=n^Ra5dsVqgNn|$N@X3)I);ENKXpwU
z5aOg5$#{u=G(oYF>M+X0DQ6^dThk_AD6e+eaL@opRgKWS!678?zC-30dEd#Z+lpi?
zxQY}VpMavGj=IDsh;Ss}Qvvp#%z^`uz}M@WeX`l>ll84W*}@(u*u{RQPaa^u+b28N
zKj@Qf>>u{Y!`>SYmGTI{F{FwE%gXvUuYgd527X4c#S4uhFb=dk(mYJX?YfKG#RYHU
z*I_{R-Liu|TYr%wNgI_@s4)-;{n%p>8;;Cs1I19KSGXd@;PH%|AEpb#&R$$J;ilqw
zeCwp}6CYQ#P>z>9(l-}xIpumZxWsX3XfZC1tu(oWg=)IIvsjC~l+#s@hL>htnc<x^
zy$U884+aBIf3KlXmU>Nvsy}UGby>l5%?b{7anOnTJ$Tku)5z(a8O5t?uBdsd0OP|r
zK#eKC81<tN*8LUbul(jC7qhQjazcrfOnn5fiv@hn-KK|cqs&b;P*aKjPHA4_?zg-C
zky8g)mp8>0EOT)3irkWF%R_QL>^aVG^Y41WsP?^0%c=IZpRUdvUwFLIvF4y{?wAUm
ze*&>V{X$wV@c5{N^e`8C-YU&%r=6KfY*m%0uEG6$A+FgXD+Ac`wRq$7?qV&LW>+l7
zKN|DpSU<4*Uy^?9W=j%^0uJ~>`<2HN82<lZzrb)z-F1i3xz|f8x8LRp(_>WyT70Se
z49FJ#e_6=Zg~jr|EtdKs{^$#4?evqyf~lM0skVd1y$nuHVL0uEA)NN}1n*bF@aH^A
zikX!#WRixV!qcF_lbyPb%_=r{@~kzerV8rJp0G9Ac5b&@-A?Dz&P_Z1yw_4UVR*VM
bM{hYbcCZFu@vJ6yzI5??jeEu_a=ZC2o;gYh

literal 0
HcmV?d00001

diff --git a/cnn_mapping/__pycache__/mapping_point_generator.cpython-36.pyc b/cnn_mapping/__pycache__/mapping_point_generator.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1ce07c393ed618a321ba813a35e1c5b45b8944ae
GIT binary patch
literal 20273
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
Xa~Dy6!OfMPC_PiUg!F_v=a&92@YG<t

literal 0
HcmV?d00001

diff --git a/cnn_mapping/__pycache__/optimizer.cpython-36.pyc b/cnn_mapping/__pycache__/optimizer.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c2826cc6b4ddd0fb969c87561e1b1c262dd385b1
GIT binary patch
literal 1442
zcmZ`(&5qkP5GE<omSuahH8$Bxu+X807-(Z4Jrr0JZIQG&1jQC;0u(UP3bI7m@=~Ho
zQJdP3PR_Bf&<E%%@!C^gA*T-Mbv6zV2{Rhba7Od<kzb9+!Rfod`IV2*zvzR<1NnQP
z`X^v1nxhn_MBswV3AVBavN!jfOhKk|=41wPZ{7!al=|u5EuQ=7I1SPvNQ1QZ5=~FG
zkAqjT3I)I6BFvgH(YY)`nT4{_d692px6V{t@HbLj2mfJ6VT#Rp5m!}SE~853rH+=o
z<SN!ufhkC2t)oJwT)=7|q^u%dHU%t(izdssa?7jd358hp82~Y$XF&Duz%*Lp7PYt~
zt+%7Ey^eOQ>uIv~+8$`p&U;O|e&@HIdZlTKTe^czfJ9n$E5Xh+1L^_wcNC+Rf-hTo
zP&M6VK?u)}H?e49%|pH7q0QPB&f{bi-c}d7>b`KB6;Gr}-PWVp!#BBJIdxscLU4#;
zLph)A{hw_cV-ec^EH~k!>c#Xj+<x{;Q-Yp{kCIISF4N2H*;DIz6!|io`iek1%;zwT
z=*V{0@#ru$Wnp51CD&1$B)qN-s}u~!oVXDzgiNksVzrsLbrma}+vz&p(CMH+uIlN)
z_=?xEQ3*Fp#2c;*UD-(e8?F|z=4O1THL|rDT5*+`$pT6^PSXtcsYD`&Z9%M5ym2o7
zAax(oefQmLB?~@lYWVMLQ6z~J#f<YOUqAU0eh5m<g^1NGDa%9T*)24=dR%SH*tX`q
zCV-gr2{6=qfG3RN0NyjK&Ovhow;m`Q-2MVV!y($?j%vIncd+Z&pD$YW1N!YLK+juK
zuvqW`AiI9sZ|OBs7j3@-SUDhGXa?}x1CgZ`etYP_vHauWR|HUfs~Ola0F|Y*^_|^^
z?*X3vk^nf_mGSa2+nzsbl;Wih53P2v0`NRM7;L*gM$9L0G%zd^GS+)I9XovzO1_1X
zov(rm2`PI@)zC8A<>^3;tUR{Nc3j=F>=f91R8)6C&G-nohPsFoyV)XO&mMqe2JgrC
z5SF!Ni1_%F2IQ3an7S9n=~3+CGomiQJ|$Pr9R;QzMX5}p$RJmxI}XZTF@^}P?EPZM
jf;%WU*AIU05^*{B-@wJy2>z`-Otr0$;t?JZOTpxSX`hkA

literal 0
HcmV?d00001

diff --git a/cnn_mapping/__pycache__/resource.cpython-36.pyc b/cnn_mapping/__pycache__/resource.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d38ca305f42fd261fd93ee5ecf6058e3cf9acb87
GIT binary patch
literal 6276
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

literal 0
HcmV?d00001

diff --git a/cnn_mapping/__pycache__/schedule.cpython-36.pyc b/cnn_mapping/__pycache__/schedule.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6888ce6b7ba0cb4825ab7a78d48f5940713593a7
GIT binary patch
literal 1529
zcmZux&2Aev5GJ{Q^2V;w7IEVo3Lb*M0ul>#fEEw}!$1nO=s}kNH6Yg|R!iDinY&z*
zl;b$7lkyxnw{OyC;ITdV6?*D$WvNn80-POw<jgn28Sbl{owOf)5|3hp{z7Xb1pNf2
zc?N=`A>x=5iAypJF!}-UfQKIu4@Ec+h7ph6qHcV*o4(D*f={KO<D#<ZJqFt@c3V=Z
znu%&!<^Zfl0NM#m^BjagLku*8<6*#));%7E0$lU>Bbwu3%n6WmTxZFV{R!?<3d20G
zGSAwlA3Pl`DlTsOXJ_p~X)g4ORvk%|UlrBmVpV6_7Pe3oAoPTOV=R^8Mo3zU^8Cfw
z2|cR#2J%XCdU$?5Yl%JihEosFm&cS^QPxUla<OfSJF#i7!Rrl7o!MgjJUv)K(@HBT
zeSkd*cA1ny7N+c`t;>}s<|8qEYR95wHT2!M$j3C(f`W~DCpfi=js(@BmPMXf01i|I
zU`^FUYsbY!Q32d0wek$q-BtK)ic10hin7+~M$jKm>C_goxPv@YwTR8vgZYrzq8juA
zT<hXG`}FJ~Klz?6GF<YuXN7sV<3aBG#E%Zl2<97@<_{1JZV*Ea;pi&R-(DhE;oIj8
z`5v9`&4LC^@Pyc45;nm;bPz_@Pft-5H^iT_k&PQXN#?M_@jkS-KQjvpG>dL|gTcoy
zv-tLB+iAkNU;Q*ofG^%hO#-Jqqg-2)6_zy7Rib}u;!E5_P4XIDOaI+R6Vk+O6!H{Z
z|9Xl5MQn>B=;~l_59y$L0-~F`osEWeyQ@MhO6=mSu0_Qik;0|ERLo{0&;uzd7ea4X
z7vE%ZDvXPCR$U6W`=3g{I|_}E7aE>D(g_HMrAy(3vbOz=-t}1Mox7-oen<K-V1FO?
z#;O#(sS(=rMrEEWS@wiD`tIl@R2x7mq|9_LuPRnTpwK+MWj=@Xd)Hym425OvOYmmC
z27yS7J2=KEenMjM1c#t~hMxhpP4@8J=gS9wxU|guJ^A6k{zuhz#2276&=bCrAfY02
z|HlXh|0daH&?PR&rEy_VU8ojWh&`}(on@#8ure(VS&Lw~+r@)!;!~-zQZVLH#!BUX
ze4uYLc0JAH!%o5&S2<()EAReME;D0FVaJN=r+}>S``gt%2<;o**TnehbkdNdk6Uce
mjkUiphqRAOZ+Sgdqlw6Ed*J`Pxz6iFXvf~I@z)iSZSoInvzr(I

literal 0
HcmV?d00001

diff --git a/cnn_mapping/__pycache__/utils.cpython-36.pyc b/cnn_mapping/__pycache__/utils.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fb6930555908740a1709a0ac7713dba1bf95a823
GIT binary patch
literal 759
zcmYjPJ#Q015S`uo@ZH%CD5OafQP8-6lR`m}2qA&!u#ganbP`y1zO^}L?<2cw6s*0<
zC?!9Eo_|73xh)lcfr{BpkiDlFy*KkTJ2SUW$K&K@{GDw)fZwopDB>4r@)5ccO2VNg
z86_4|#9rnj_DcUNWI-9cgGu;@pmah^%-gn`v1VN(85Zlsf(b|GR$xzp7NWgGlfTd@
zP(;IueuFLP$sO|?qj$`A%tKYs`zq7~mBAAF@cKp#bg(6_;KQaLl&~Z!TE$1uN7o<K
zz+#ts+sB&f!7=Fg7{|Hv<c;?BxhPPZ*z8WXQ!G3kY4Trx4p+qm=x{aE(UuUndVK+E
zq(kj*-HLD>bSm6F#>VHBRL0v>of*2-w4!7}ngd4)-p((pW+}~~<6SOPrK+~Ev22Vq
zpSeU?)yCtjF@eaNB{P&W<4xbcF@eep#9`ibtSL><iK<bPBn!G0fv}4f1M4DmS?nre
zF`32qi)NgCW;`3Zo@TaFX@c8WvWuC(;U6FlvBuxC^ix~2bS-g=w5aFvme(m`r_W9w
z<Bb?pjPqQi^QM{A*cOhGu2se5lkSVT=lZ*ysbNz2SW%v!19ITLkVM2sG$QxOL&OO=
vp$AkPp<+4-4G8--#n3u@wP0w$T+;Qn=N{N(bY8dRnzQHjXGnY3h>YkzASA-<

literal 0
HcmV?d00001

diff --git a/cnn_mapping/buffer_enum.pyc b/cnn_mapping/buffer_enum.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..efaca92b3adcf06dc207562a4b9c4bedfa1dda7a
GIT binary patch
literal 329
zcmYL^!A`?442Ioy>!wP)L&PbQppkarf)H@1RB5mS;?hgBB`HKo(yB=gdko%)XMz{N
z=_ZjV-|yItV;8?y)z{Cr5O7%;>LVV1jgSBxGJ`GynM0R@ETAhuE}&b0T*4bIQ*Mi>
zo@3vui6|E>38zuj)y3tBcEUudi0<uSB(!ZdH)J^5`(*dp1bj-H-KMTI76YC7(0M|E
zc%@5ZSRpu<gWx=*Sli69KTER<bME^K#Tfj<KjD>q4py<~)#TaH3NaYVl-k~HZ?(hE
reNe_6CMKNY*yO0)2RqIa@ib9Ap28Zd+}lA$qaIQ_J~_&~%+me?EdogF

literal 0
HcmV?d00001

diff --git a/cnn_mapping/cache.pyc b/cnn_mapping/cache.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d187a292cb392bb7ae2a86ea7b516fff0ab5a953
GIT binary patch
literal 1675
zcmb_c&2G~`5T3Q2l$4(qfr=_|@CC`B(4Yzlq!t7eBu+tcPDFymwKuJs^*Z&g3q|RL
z@&Y~ZK0FgV0L+Zj6v~l0@nm*0GduHrGwc7nx_I*Adz!-R@$vT=zV;r948H<2Kp|i#
zKx7^$4@LqqAHD({1H2vjkOeS^T4<jC!Y2}_Ia+3FzgDbmCF!o3A3+8$@U?eQD4@uA
z(9ol^Fe*j#SP5q53|kNnqJUh;Z!yH@wbBz+g{e-g4M!zvbVit##iVvB3l9=qD;v5p
ztW;K~Dy(Yb@<Oq5N>x&d^t*+x{eWUBU<x1scCY}{1sn@_`ECi0d~hCB``&~76*lt!
zH44B5r$!rW)PkwUN}CECFf#pU0grNvC`?^Qtqzp73{sVt9fctfxIA^Pg9_Iqi)0ex
z0^H^K76OaVG9vkB#o#w9rAM)cW-*^aNPogokeUbuu&^7b^>)ib^=hjs+uJVEwA4jU
zsr5(e_jBWL(<!Z!s+Sr=$4_#z)8k~;CWr14`b(Lc+(}8gB>|!%?%;=^C0HprhL(gw
zbOH7l)Kx?knI3y!yEA}he~cHPdO+k4&WsVk)d6iq6x2RM!4y&tyfOL^=}oeR{BCH<
zFx@2>iT5HIH*Aw>j(*VR7>)vIWnyXoMy+2O#ec<A36sIRG-M<$iE#UZz$4-*Wyx?}
z!<B7Q^q?yOFD1|@tvPt#aB&{I*&16*0D;*ciDi93eEmOwM(j2T$;NUoAhgk5oDV=Y
zEf@z-ov`=JzD?bHgkE#zrU5)Ld?ySd>N5Kn#ou&%ta68ANW<7YB?CJsOiUJX*UrtG
zNr<mt2&N(?92_C?++tt4yfm+>s;nICV-G5mHC;`uJt-$zjU0DAvlf$Myo7@J<MDSh
zOR2QFKniILxy**cTe!4T1#x&?-1KgX8zSOjsGX!VNui|Vk(aV4vs%-Va+5MEQz>JL
z7%!7pL2;HUYyUg1G0i^@52e%g+g_*L>Gb(NZLXA3Yn2k-wz+30_i}p=_t^J>^Wpnr
Ov%%ph<z}gsmc8GqnPCwC

literal 0
HcmV?d00001

diff --git a/cnn_mapping/cost_model.py b/cnn_mapping/cost_model.py
index f60fa89..a230bc2 100644
--- a/cnn_mapping/cost_model.py
+++ b/cnn_mapping/cost_model.py
@@ -4,11 +4,12 @@ Cost model.
 #import numpy as np
 from operator import mul
 from operator import add
+from functools import reduce
 import copy
 import math
 
-import loop_enum as le
-import buffer_enum as be
+from . import loop_enum as le
+from . import buffer_enum as be
 
 
 def get_comp_cost(layer):
@@ -61,7 +62,7 @@ def get_hinted_para(level, hint):
     assert hint
 
     hinted_para = 1
-    for loop in xrange(le.NUM):
+    for loop in range(le.NUM):
         if loop in hint:
             hinted_loop_para = hint[loop][level][2]
             hinted_para *= hinted_loop_para
@@ -76,7 +77,7 @@ def valid_dataflow(resource, hint):
     '''
     num_levels = resource.buffer_levels()
 
-    for level in xrange(num_levels):
+    for level in range(num_levels):
         if resource.paras[level].count != 1 and \
             get_hinted_para(level, hint) < (resource.paras[level].count * resource.utilization_threshold):
             return False
@@ -418,7 +419,7 @@ def get_array_access_and_cost(level, para, access_list, point):
     nearest_pe_cost = para_cost
 
     [if_block_access, of_block_access, fl_block_access] = access_list
-    partitions = zip(*point.loop_partitionings)[level]
+    partitions = list(zip(*point.loop_partitionings))[level]
     para_dim = point.para_loop_dim[level]
 
     partitions_nearest = [1,]*le.NUM
@@ -426,7 +427,7 @@ def get_array_access_and_cost(level, para, access_list, point):
     across_block_cost = [0]*array_dim
 
     if para_mode == 1:
-        for i in xrange(len(para_dim)):
+        for i in range(len(para_dim)):
             para_index = para_dim[i]
             partitions_far.append([1,]*le.NUM)
             if len(para_index) == 1:
@@ -446,7 +447,7 @@ def get_array_access_and_cost(level, para, access_list, point):
 
         array_access = [[array_if_block_access_nearest, array_of_block_access_nearest, array_fl_block_access_nearest]]
 
-        for i in xrange(array_dim): # Don't get it
+        for i in range(array_dim): # Don't get it
             if_partitions_far = partitions_far[i][le.FX] * partitions_far[i][le.FY] * partitions_far[i][le.OC]
             if_partitions_far = if_partitions_far if if_partitions_far != 1 else 0
             of_partitions_far = partitions_far[i][le.FX] * partitions_far[i][le.FY] * partitions_far[i][le.IC]
@@ -463,7 +464,7 @@ def get_array_access_and_cost(level, para, access_list, point):
         return [array_access, [nearest_pe_cost] + across_block_cost]
 
     elif para_mode == 2:
-        for i in xrange(len(para_dim)):
+        for i in range(len(para_dim)):
             para_index = para_dim[i]
             for j in para_index:
                 partitions_nearest[j] = partitions[j]
@@ -502,7 +503,7 @@ def get_access(point, layer, resource):
     mac_capacity = resource.mac_capacity
 
     access_list = []
-    for level in xrange(num_levels):
+    for level in range(num_levels):
         if_block_access = get_if_access(level, point, layer, mac_capacity)
         of_block_access = 2 * get_of_access(level, point, layer, mac_capacity) - 1
         fl_block_access = get_fl_access(level, point, layer, mac_capacity)
@@ -510,7 +511,7 @@ def get_access(point, layer, resource):
 
     #para_mode = [e.access_mode for i, e in enumerate(resource.paras) if e.access_mode != 0]
     para_mode_level = [i for i, e in enumerate(resource.paras) if e.access_mode != 0]
-    partitions = zip(*point.loop_partitionings)
+    partitions = list(zip(*point.loop_partitionings))
     array_costs = []
     if para_mode_level:
         # access at array level
@@ -546,7 +547,7 @@ def opt_get_access(num_levels, point, mac_capacity):
     #blocking_accum_arr = np.ones((le.NUM, num_levels+1))
     #partitioning_accum_arr = np.ones((le.NUM, num_levels+1))
 
-    #for i in xrange(le.NUM):
+    #for i in range(le.NUM):
     #    blocking_accum_arr[i][:-1] = np.cumprod(blocking_arr[i][::-1])[::-1]
     #    partitioning_accum_arr[i][:-1] = np.cumprod(partitioning_arr[i][::-1])[::-1]
 
@@ -559,12 +560,12 @@ def opt_get_access(num_levels, point, mac_capacity):
 
     blocking_accum_arr = []
     partitioning_accum_arr = []
-    for i in xrange(le.NUM):
+    for i in range(le.NUM):
         ba_current_level = [1]
         pa_current_level = [1]
         ba_tmp = 1
         pa_tmp = 1
-        for level in xrange(num_levels-1, -1, -1):
+        for level in range(num_levels-1, -1, -1):
             ba_tmp = ba_tmp * point.loop_blockings[i][level]
             pa_tmp = pa_tmp * point.loop_partitionings[i][level]
             ba_current_level.append(ba_tmp)
@@ -574,7 +575,7 @@ def opt_get_access(num_levels, point, mac_capacity):
         partitioning_accum_arr.append(pa_current_level[::-1])
 
     access_arr = np.zeros((num_levels, 3))
-    for level in xrange(num_levels):
+    for level in range(num_levels):
         access_arr[level][0] = opt_get_if_access(level, point, blocking_accum_arr, partitioning_accum_arr)
         access_arr[level][1] = 2 * opt_get_of_access(level, point, blocking_accum_arr, partitioning_accum_arr) - 1
         access_arr[level][2] = opt_get_fl_access(level, point, blocking_accum_arr, partitioning_accum_arr)
@@ -584,7 +585,7 @@ def opt_get_access(num_levels, point, mac_capacity):
 def get_bank_size(point, layer, level):
 
     blocking_accum_list = []
-    for i in xrange(le.NUM):
+    for i in range(le.NUM):
         blocking_accum_list.append(reduce(mul, point.loop_blocking(i)[:level+1], 1))
 
     if_bank_size = get_if_bank_size(blocking_accum_list, layer)
@@ -597,9 +598,9 @@ def get_block_size(point, layer, level):
 
     blocking_accum_list = []
     partitioning_accum_list = []
-    partitioning_reshape = zip(*point.loop_partitionings)
+    partitioning_reshape = list(zip(*point.loop_partitionings))
     partitioning_list = partitioning_reshape[level]
-    for i in xrange(le.NUM):
+    for i in range(le.NUM):
         blocking_accum_list.append(reduce(mul, point.loop_blocking(i)[:level+1], 1))
         partitioning_accum_list.append(reduce(mul, point.loop_partitioning(i)[:level+1], 1)) #FIXME inclusive mode also duplicates data
 
@@ -617,7 +618,7 @@ def get_block_sizes(num_levels, point, layer):
     '''
     bank_list = []
     block_list = []
-    for level in xrange(num_levels):
+    for level in range(num_levels):
         block_list.append(get_block_size(point, layer, level))
         bank_list.append(get_bank_size(point, layer, level))
 
@@ -709,12 +710,12 @@ def valid_mapping_point_current_level(resource, point, layer, level, verbose=Fal
         valid_size = fit_in_level(resource.buffer(level).capacity,
              get_block_size(point, layer, level), resource.invalid_underutilized,level,resource.memory_partitions)
 
-    partitioning = zip(*(point.loop_partitionings))
+    partitioning = list(zip(*(point.loop_partitionings)))
     valid_para = valid_partition_number(resource, partitioning, level)
 
     if verbose == 3:
-        print "Level ", level, ": Partitioned block size fit in bank: ", valid_size
-        print "Level ", level, ": Partition number is valid: ", valid_para
+        print("Level ", level, ": Partitioned block size fit in bank: ", valid_size)
+        print("Level ", level, ": Partition number is valid: ", valid_para)
 
     return valid_size and valid_para
 
@@ -744,14 +745,14 @@ def valid_blocking_size_current_level(resource, point, layer, level, verbose=Fal
 
 
 def valid_blocking_size(resource, point, layer, verbose=False):
-    for level in xrange(resource.buffer_levels()):
+    for level in range(resource.buffer_levels()):
         if not valid_blocking_size_current_level(resource, point, layer, level, verbose):
             return False
     return True
 
 
 def valid_mapping_point(resource, point, layer, verbose=False):
-    for i in xrange(resource.buffer_levels()):
+    for i in range(resource.buffer_levels()):
         if not valid_mapping_point_current_level(resource, point, layer, i, verbose):
             return False
     return True
@@ -766,7 +767,7 @@ def get_total_access_cost(resource, array_cost):
     addition_levels = len(para_index)
 
     delta = 1
-    for i in xrange(addition_levels):
+    for i in range(addition_levels):
         index = para_index[i]
         total_access_cost.insert(index+delta, array_cost[i])
         delta += 1
@@ -795,12 +796,12 @@ def get_array_level_cost(resource, point, layer_size, level, next_level_access,
     level_access, level_cost = get_array_access_and_cost(level, resource.paras[level], next_level_access, point)
 
     total_cost = 0
-    for i in xrange(len(level_access)):
-        buffer_access = map(mul, level_access[i], layer_size)
+    for i in range(len(level_access)):
+        buffer_access = list(map(mul, level_access[i], layer_size))
         total_cost += sum(buffer_access) *level_cost[i]
 
     if verbose >= 3:
-        print "Level ", level, " array level access: ", level_access
+        print("Level ", level, " array level access: ", level_access)
 
     return total_cost
 
@@ -822,7 +823,7 @@ def get_array_and_curr_level_cost(resource, point, layer, level, verbose=False):
     [if_access, of_access, fl_access] = level_access
 
     buffer_level_access = [if_access, 2*of_access-1, fl_access]
-    total_buffer_access = map(mul, buffer_level_access, layer_size)
+    total_buffer_access = list(map(mul, buffer_level_access, layer_size))
     # level_cost = sum(total_buffer_access) * resource.access_cost[level]
     level_cost = 0
     for i in range(len(total_buffer_access)):
@@ -833,7 +834,7 @@ def get_array_and_curr_level_cost(resource, point, layer, level, verbose=False):
     # level_cost = sum(operand_costs)
 
     if verbose >= 3:
-        print "Level ", level, " access: ", buffer_level_access
+        print("Level ", level, " access: ", buffer_level_access)
 
     level_cost += get_array_level_cost(resource, point, layer_size, level-1, level_access, verbose)
 
@@ -854,7 +855,7 @@ def get_level_cost(resource, point, layer, level, verbose=False):
                     2 * get_of_access(level, point, layer, mac_capacity) - 1, \
                     get_fl_access(level, point, layer, mac_capacity)]
     
-    buffer_access = map(mul, level_access, layer_size)
+    buffer_access = list(map(mul, level_access, layer_size))
     # Inputs, weights, and outputs may have different costs
     # level_cost = sum(buffer_access) * resource.access_cost[level]
     level_cost = 0
@@ -869,7 +870,7 @@ def get_level_cost(resource, point, layer, level, verbose=False):
 
 
     if verbose >= 3:
-        print "Level", level, " access: ", level_access
+        print("Level", level, " access: ", level_access)
     return level_cost
 
 
@@ -879,17 +880,17 @@ def get_total_access(resource, point, layer, verbose=False):
     access_list, array_cost  = get_access(point, layer, resource)
 
     if verbose >= 3:
-        print "access breakdown: ", access_list
+        print("access breakdown: ", access_list)
 
     total_level_access = []
-    for i in xrange(len(access_list)):
+    for i in range(len(access_list)):
         ''' List of total access of each buffer at level i'''
         if not isinstance(access_list[i][0], list):
-            buffer_access = map(mul, access_list[i], layer_size)
+            buffer_access = list(map(mul, access_list[i], layer_size))
             total_level_access.append(sum(buffer_access))
         else :
-            for j in xrange(len(access_list[i])):
-                buffer_access = map(mul, access_list[i][j], layer_size)
+            for j in range(len(access_list[i])):
+                buffer_access = list(map(mul, access_list[i][j], layer_size))
                 total_level_access.append(sum(buffer_access))
 
     return total_level_access
@@ -900,7 +901,7 @@ def get_level_costs(resource, point, layer, verbose=False):
     num_levels = resource.buffer_levels()
 
     level_energy = []
-    for level in xrange(num_levels):
+    for level in range(num_levels):
         level_energy.append(get_level_cost(resource, point, layer, level))
 
     para_index = [i for i, e in enumerate(resource.paras) if e.access_mode != 0]
@@ -931,18 +932,18 @@ def get_block_cost(resource, point, layer, verbose=False):
 
 
     block_costs = [0.0, 0.0, 0.0]
-    for i in xrange(len(total_access_cost)):
-        buffer_access = [a*b for a,b in zip(access_list[i], layer_size)]
+    for i in range(len(total_access_cost)):
+        buffer_access = [a*b for a,b in list(zip(access_list[i], layer_size))]
         block_cost = [x * total_access_cost[i] for x in buffer_access]
-        block_costs = map(add, block_cost, block_costs)
+        block_costs = list(map(add, block_cost, block_costs))
 
     if verbose:
-        print 'access_list: ', access_list
+        print('access_list: ', access_list)
         bank_size_list, block_size_list = get_block_sizes(num_levels, point, layer)
-        print 'bank_size_list: ', bank_size_list 
-        print 'block_size_list: ', block_size_list
-        print 'layer_size: ', layer_size
-        print 'block costs: ', block_costs
+        print('bank_size_list: ', bank_size_list)
+        print('block_size_list: ', block_size_list)
+        print('layer_size: ', layer_size)
+        print('block costs: ', block_costs)
 
     return block_costs
 
@@ -966,24 +967,24 @@ def get_cost(resource, point, layer, verbose=False):
     assert len(total_access_cost) == len(access_list)
 
     total_cost = 0.0
-    for i in xrange(len(total_access_cost)):
+    for i in range(len(total_access_cost)):
         ''' List of total access of each buffer at level i'''
         if not isinstance(access_list[i][0], list):
-            buffer_access = map(mul, access_list[i], layer_size)
+            buffer_access = list(map(mul, access_list[i], layer_size))
             total_cost += sum(buffer_access) * total_access_cost[i]
         else :
-            for j in xrange(len(access_list[i])):
-                buffer_access = map(mul, access_list[i][j], layer_size)
+            for j in range(len(access_list[i])):
+                buffer_access = list(map(mul, access_list[i][j], layer_size))
                 total_cost += sum(buffer_access) * total_access_cost[i][j]   
 
     if verbose:
-        print 'access_cost: ', total_access_cost
-        print 'access_list: ', access_list
+        print('access_cost: ', total_access_cost)
+        print('access_list: ', access_list)
         bank_size_list, block_size_list = get_block_sizes(num_levels, point, layer)
-        print 'bank_size_list: ', bank_size_list 
-        print 'block_size_list: ', block_size_list
-        print 'layer_size: ', layer_size
-        print 'total cost: ', total_cost
+        print('bank_size_list: ', bank_size_list) 
+        print('block_size_list: ', block_size_list)
+        print('layer_size: ', layer_size)
+        print('total cost: ', total_cost)
    
     #return total_cost
     return total_cost, total_access_cost, access_list,layer_size
diff --git a/cnn_mapping/cost_model.pyc b/cnn_mapping/cost_model.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..40cbda90146d73516306789be7a9fc61f62a6735
GIT binary patch
literal 30426
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

literal 0
HcmV?d00001

diff --git a/cnn_mapping/extract_input.py b/cnn_mapping/extract_input.py
index 88b88fd..e0a9620 100644
--- a/cnn_mapping/extract_input.py
+++ b/cnn_mapping/extract_input.py
@@ -1,6 +1,6 @@
 import json
 import os
-import loop_enum as le
+from . import loop_enum as le
 
 
 def extract_arch_info(arch_file):
@@ -30,7 +30,7 @@ def extract_arch_info(arch_file):
         data["mac_capacity"] = 0
     if "parallel_mode" not in data:
         data["parallel_mode"] = [0, ] * data["mem_levels"]
-        for level in xrange(data["mem_levels"]):
+        for level in range(data["mem_levels"]):
             if data["parallel_count"][level] != 1:
                 data["parallel_mode"][level] = 1
     else:
diff --git a/cnn_mapping/extract_input.pyc b/cnn_mapping/extract_input.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..484996abc43531675d33c2bc2f63c5fb1bbe34d4
GIT binary patch
literal 3774
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
O&hv%xweoWL$$tQ!9Y{R@

literal 0
HcmV?d00001

diff --git a/cnn_mapping/layer.pyc b/cnn_mapping/layer.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..11964a414602035bc24c14c8d4f238df74ac13ac
GIT binary patch
literal 2367
zcmb_d%Z}SN6s6?H*v<<{o3!Z*1Ol`gAQ>Y8(gM>5+62w2n1yE5*$5g*wm6X`!=zzM
z;8mv|(0)XJqN{#LzoPwto^vVBc#?EAvBk^7OJ3ef-UmDX-WdJ<&tF-l+Fu9#_h|M@
zkX)%F&_ES|ngl8j)vrpODfRPFsPc{~Lg9ALxgC}F)M3=8{5_D-Pw8o~&~{#AW@56`
znWo+wxgMru=3HwRoM)68gA~vTWuVXk;6Lc@s3R!tQZ?-e)KO2xhY^MC%K+*$eg_A-
z60P%ek<JQNEbQJ$W@<B;?dt~`T{_oUnbvhtVUkjH<LA)5F}D&qFSRncE4@g$#V!jo
zEuH7DWGlbX_VO+ErR5V-?dz3npn+kq-WGey^tO0yW>Yy-JzqL)X6dxBIyz2WR_?a;
zSeNf>>lP+2v^B2^ZECMU=Vn&aR-D31DBrfyD|>yZ!F8)_1j4q1_8iUr4YCf@TB!se
z6o6qz0ES%w81~47XFpsI)cYTBJ*N6xAk1OQ#4>!C#S}h(9ks>>Fi;RB7^*csfD!2l
zVkT5CyUPBi+%@%!7;^$$p83ZXbFg9lxnV*Vw7@(V18X6>qo!Wnbq3^N#Pm3j!y6zK
z-2ib6Kn9lw@UsBMfq-%Y7)YM80V_J3;^hX=pI#i!@KXdgvE~PBiv?5Y$Hk&qNEXqZ
zHlhn;sV%BWOwYt235|`pdrSw#1Ck*L1>$QU5t=9VYoKx2%!=_6YV7!UmSs&f8yCfs
zubw<IH517dRh2HrSzRYclewv<W68C>`KjaXNn&c_l7zW$KLb(0u>Ic+?w;czF#j2?
zWTPn(KQ92_MBF^W;6A(1cOBn#eb@6{-*-E{8~ARh?w<|eDW37b-2pXBjf9Dvv`O#Y
z1G`zeH~18ig_41YpLXbzz+K09W$L_HC4K?j-!j@I+(EK0p>IUOr{0!C%kUE31-u1E
ze`S>wSDJd#yhHD><ch1l0I>9x3U9*&Hv_5Gt@mma%p`F<Lz2vzd|7eG;7O9a$&w_#
z1uWN+RjIWouVs_RAA@;etDvifQ;aPYjkbJD`nUSwo!er_i|3bL4qn_duKNh&^_K&0
z1|EqH9|_*AU4U#JiOI66P9J3r9)Zji`Tso{5tH_zX0hMZ-|C1Niy`RlL%l+3g2}px
z?lBlhbuxVS*cV`5E9D%}&jgfM{~W-fU`d5yt=YVGZ2{`3vw;ev>hO@h>O_QcIpPX&
zUd-aKmG+mD{lYO<_6eQ;6wT5I70AOIe*zePO2UNqRsn1U#Fh1GY`2GIS<Cvpet6(j
kQ=#L%HpeG$qQ4f6@x__nNia%weB<-sI|(E)B)qr#AMoxGHvj+t

literal 0
HcmV?d00001

diff --git a/cnn_mapping/loop_enum.pyc b/cnn_mapping/loop_enum.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..bff79e6b218fef3887174aa0a4543dcf25656f22
GIT binary patch
literal 696
zcmY*W+iKfD6g-k`*<Qy<`v-bdAhjS5>Pu-0fk2?OK&6oEi;#D>(SmMRD@s12|Imki
zM!%{3fzFZblxWe+IioW>%WCp>Eq?s@trQ)f3HT%4{ue+KNuWp4Bkhy)Nl!>lNKZ*l
zNzX{mNCzYX(sPn?(hHIcvM849O0-~GqF3xo^cfoyy=G^k&)J&j3-%^*Ioc4jgoYde
zLeL6?q%#nr)*xh^gOG6n8v<U@m*_R0_$NSoYTGU}%}|H#sWTff3VmoBRSnvN-)!Z~
zKKyRAE5qpa{_^T1mBv1n4%!1W(GIQ~+-WZ5xubNNOEGsEQ)SUKrV69<27|U?>$7$T
zP3#J%5SVT+H^SnaWIYC-fv?<78D<Ot!yMrF>+Su49!5$JU3%<pM)B@I>2@2f*v8&G
z*R9I)3?*e8mGNd7M`aw9aa6`pj<xOA&yE#W>?-2~stWg*k8OmG{zLx(ZCtjsiHF|o
z`*>F?)mC+E%=O#rH@3n3_RdsQv5!^L<aN<?wt0-l4f)4xx+k~59`EW_50!b(b$<m2
Q{J?v$eBsTXmw3_r195_jMF0Q*

literal 0
HcmV?d00001

diff --git a/cnn_mapping/mapping_point.pyc b/cnn_mapping/mapping_point.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3234fb041e5494397faf1ba8e7904fad3ae0102c
GIT binary patch
literal 4308
zcmeHK-EP!I6!vCAfE4Ht7gc*TD!nk$viTuUM1NEj1qlgKv``5WA<H`+X9sN0$}>wz
z#a(%UzDA#-&(yv^zjMYO?`{$)7tpIFT6=uv%=!7|oX_L_KbP14`1>y@qvo%V`;Yip
zflC%e`?&TZ)r<08l&wVXqUiT1dcMCBW&P+$yh@s1<FfwrXsSeRYLN;%RZ{0#iZY!}
zb#*AFMptgQ?k+*`k(WItQE<9~iJ!>SEnF0w!WXV^a*n*e>qYykjrV;>`V_|gT9mEw
z;CwWC60gzn6-2)-@ORHtxjvlLsne#i!sI7}HC$)aCLp0JS<EtJg_|fLO*t);Qvw26
z>nWKbD>PRaGZm)J6mqRHeq=-A!pK*YZk|eKYWAv9IT7Poo<q4%uT?Sd%cp7WG#Mp*
zQ#m78lU3k{?Lj9k3RQ?%rJWrJ<zy4`E?Hd)gV$T-C`z6>7EW4IUUjYP)KnQcc7`2!
z*OXQ21Y9lz498<7)0tI5JCPXxR2he@eWgS>LmXCBm_r8akPVgwuG}OAWR+BGRaiJI
z)Pm{xY~~|h0H+00+hf6tYF3T`EHZAf(za~jJC+q?#sJ&K@#A(AL}@al=eItUQd!%G
zss+n3wQ49hMJlq*I8%8#E8O+FqFDtPD)q*BKNMK00LD>RvK2IaQCO56R_MdY7_Bp{
z4f&?6;XMz_u04FT`#=~}AC#K1pj0U!L=EhLa+ax#SIBed1^Q82-J`yUae3Q|-bPV^
z!3q!X*yjNrS9#E<rh5|ipuESO?LNYgiYei8x9&>&+!mL0pS7a-U9;{o#1v`5%QIcZ
z6p&lR#i}BAAGgcca#CpP+|^bVtb6(At$e|SpCk7ReppQTMtrf9|Hj0WY6B%)+l_H4
zr76k{rMAD>z5x<~(5a$G>kU~|Nkds1%{}qdH9c|{U?)j5S}{q!#MqJ`TD{n#e@RHU
zKSrF81Kcke_b)uC_BGNEd-|}Wk%m|f^=nme^EL%aMK)4yR#%`eHv=P4Nf8Hm`q5}(
z6b#cYNo`s-^t8~(!KJVMfzU%W#Fa?VTP5D6jS@dUqc*77r^*IQaAY~xK&h*IRj5)`
z%r$O8eZ#T2gUuJ>d$B#B5Pc$zK{5fwIzzcvsxHmEF?NiAJ3sS;ITXV4G=cGy{8&Lu
zX6nPV(!Z%pq`q%C`G%IQ&qjeDJXCXl?hX%;ynj=<U(F5AxxP=uM5{Wj<>Ux-OC;+P
zlVIpn<2?fX0A_;$`0*g#9Ei>90}*cx#1`EF!4BPT4#X|G?+nCEy5AazZMxqch}+j+
z1XHC-VVpwhFkn>T`_BL<nFc;%^nXKO0&>9aK?`O&Y-1m{j|;2m)iD$g{I-L<*<b2G
zvaX&<)EF4V-VL?{hhwTaK_lwOjCQ0EzFE)<VtGvL_4P>;ekxzK&rTXY`J1j5T6udX
z_?F^rr~I81PI25SvW=5tYgJA`p_^_;Z0k5K?R0l1#Z$BH)M&)2XR%4j!{IQ%&!j#g
zW{-)cMuCi}%sv2HuEPnL_AicWc(UX-5@%$}OVAF%KO|;q-wE@lE9#arl4g61AOshe
zopR{OYg2{@(EA!E1Wy%s-I|%}1asW-{`l#DID@(3j^`BY=8L9r+Z;S8FA)Wj3t=x|
zMwGD=Xr^NePRn!sc9`ytG2aGztz)aei2md&;``4*QN(%#>j@t3v?ha@6FqOWYI6su
z<@%)(>gsny@7NDeyL5En+HI5Bg}|5Zl{1#_pXjuZE|>58(dGXV4tu>=!YCqqV`v+o
zqmvzd0`YquC*>V~E?!#RYWe<LD&%0RE9mBZ7-l><_WzUO`m`;s`GWW*6xijxn9h~W
zX|uw4E=e4bX_DX@WmeGRd49}{#F)<0d!|w&(izeB^@z%ML<jY*HF)&CPQoLY=C2D&
vKG&|U^)Fqx_|?Tv_F_VCL<u_j7&qgWN;=m5K#?#?-+5eqAm`kqYb*Z(A*GFR

literal 0
HcmV?d00001

diff --git a/cnn_mapping/mapping_point_generator.py b/cnn_mapping/mapping_point_generator.py
index e563f95..aa39396 100644
--- a/cnn_mapping/mapping_point_generator.py
+++ b/cnn_mapping/mapping_point_generator.py
@@ -11,21 +11,22 @@ import copy
 from operator import mul
 import math
 import pickle
+from functools import reduce
 
-from mapping_point import MappingPoint
-from cache import Cache
-import cost_model
+from .mapping_point import MappingPoint
+from .cache import Cache
+from . import cost_model
 
-import loop_enum as le
-import buffer_enum as be
-import utils
+from . import loop_enum as le
+from . import buffer_enum as be
+from . import utils
 
 
 def get_hinted_para(layer, level, hint):
     assert hint
 
     hinted_para = 1
-    for loop in xrange(le.NUM):
+    for loop in range(le.NUM):
         if loop in hint:
             hinted_loop_para = hint[loop][level][2]
             hinted_para *= hinted_loop_para
@@ -36,7 +37,7 @@ def get_hinted_para(layer, level, hint):
 def get_hinted_partitioning(level, hint):
     hinted_partitioning = []
     hinted_para_dim = []
-    for loop in xrange(le.NUM):
+    for loop in range(le.NUM):
         if loop in hint:
             hinted_partitioning.append(hint[loop][level][2])
             hinted_para_dim.append([loop])
@@ -57,10 +58,10 @@ def get_fixed_partitioning(num_levels, hint):
         return [(1,) * num_levels] * le.NUM
 
     partitioning_list = []
-    for loop in xrange(le.NUM):
+    for loop in range(le.NUM):
         partitioning = [1] * num_levels
         if loop in hint:
-            for i in xrange(num_levels):
+            for i in range(num_levels):
                 if hint[loop][i]:
                     partitioning[i] = hint[loop][i][2]
         partitioning_list.append(tuple(partitioning))
@@ -72,11 +73,11 @@ def get_non_empty_loops(point, num_levels):
     non_empty_loops is a list that contains #levels tuples, 
     each tuple contains the loop whose size is not 1 at this level 
     '''
-    blocking = zip(*(point.loop_blockings))
-    partitioning = zip(*(point.loop_partitionings))
+    blocking = list(zip(*(point.loop_blockings)))
+    partitioning = list(zip(*(point.loop_partitionings)))
 
     non_empty_loops = []
-    for i in xrange(num_levels):
+    for i in range(num_levels):
         t0 = blocking[i]
         t1 = partitioning[i]
         non_empty_blocking = [i for i, e in enumerate(t0) if e != 1]
@@ -88,7 +89,7 @@ def get_non_empty_loops(point, num_levels):
 
 def get_loop_order(partial_order, non_empty_loops, level):
     order_curr_level = [le.NUM - 1] * le.NUM
-    for i in xrange(len(non_empty_loops[level])):
+    for i in range(len(non_empty_loops[level])):
         order_curr_level[non_empty_loops[level][i]] = partial_order[i]
     return order_curr_level
 
@@ -107,14 +108,14 @@ def opt_order_generator_function(point, num_loops, num_levels):
     # print "non_empty_loops: ", non_empty_loops
 
     all_order_permutations = []
-    for level in xrange(num_levels):
+    for level in range(num_levels):
         one_level_permutations = []
         for order in itertools.permutations(range(len(non_empty_loops[level]))):
             one_level_permutations.append(get_loop_order(order, non_empty_loops, level))
         all_order_permutations.append(one_level_permutations)
 
     for loop_order in itertools.product(*all_order_permutations):
-        yield zip(*loop_order)
+        yield list(zip(*loop_order))
 
 
 def level_order_generator_function(point, num_loops, non_empty_loops, level):
@@ -135,14 +136,14 @@ def order_generator_function(num_loops, num_levels):
         one_level_permutations.append(order)
 
     all_order_permutations = []
-    for level in xrange(num_levels):
+    for level in range(num_levels):
         all_order_permutations.append(one_level_permutations)
 
     '''Consider system with all buffer levels, generator all 
        possible loop orders, then transform the data 
        organization to match with loop_order_list'''
     for order in itertools.product(*all_order_permutations):
-        yield zip(*order)
+        yield list(zip(*order))
 
 
 def factors(n):
@@ -152,7 +153,7 @@ def factors(n):
 
 def bounded_factor(n, end):
     l = []
-    for i in xrange(1, int(n ** 0.5) + 1):
+    for i in range(1, int(n ** 0.5) + 1):
         if n % i == 0 and n // i <= end:
             l.__iadd__([i, n // i])
         elif n % i == 0:
@@ -184,7 +185,7 @@ def loop_tile_with_para_hint(tile_permutations, loop_extent, num_level, loop_hin
 
 def loop_tile_with_hint(tile_permutations, loop_extent, num_level, loop_hint):
     # TODO support more than 1 level of para hint
-    for level in xrange(num_level):
+    for level in range(num_level):
         if loop_hint[level] != None:
             loop_hint_level = level
             break
@@ -233,7 +234,7 @@ def loop_tile(loop_extent, num_level, loop_hint=None):
 
 def opt_valid_blocking(blocking_cache, resource, layer, blocking):
     num_levels = resource.buffer_levels()
-    blocking_tuple = zip(*blocking)
+    blocking_tuple = list(zip(*blocking))
     dummy_partitioning = [(1,) * num_levels] * le.NUM
     dummy_mapping_point = MappingPoint(None, list(blocking), dummy_partitioning)
 
@@ -250,7 +251,7 @@ def opt_valid_blocking(blocking_cache, resource, layer, blocking):
     if not valid:
         return False
 
-    for level in xrange(1, num_levels):
+    for level in range(1, num_levels):
         if not cost_model.valid_blocking_size_current_level(resource, dummy_mapping_point, layer, level):
             return False
     return True
@@ -267,7 +268,7 @@ def blocking_generator_function(resource, layer, schedule=None, verbose=False):
     num_levels = resource.buffer_levels()
 
     all_tile_permutations = []
-    for i in xrange(le.NUM):
+    for i in range(le.NUM):
         loop_hint = hint[i] if hint and i in hint else None
         all_tile_permutations.append(loop_tile(layer.sizes[i], num_levels, loop_hint))
 
@@ -320,7 +321,7 @@ def current_level_partition_blocking_1d_no_replication(loop_tiles, slb, para_cou
     para_permutation = []
     para_dim_permutation = []
 
-    for l0 in xrange(le.NUM):
+    for l0 in range(le.NUM):
         for f0 in loop_tiles[l0]:
             slp = [1, ] * le.NUM
             slp[l0] = f0
@@ -336,7 +337,7 @@ def current_level_partition_blocking_1d_replication(loop_tiles, slb, para_count,
     para_permutation = []
     para_dim_permutation = []
 
-    for l0 in xrange(le.NUM):
+    for l0 in range(le.NUM):
         for f0 in loop_tiles[l0]:
             slp = [1, ] * le.NUM
             slp[l0] = f0
@@ -345,7 +346,7 @@ def current_level_partition_blocking_1d_replication(loop_tiles, slb, para_count,
                 para_permutation.append(slp)
                 para_dim_permutation.append([para_index])
             else:
-                for l1 in xrange(le.NUM):
+                for l1 in range(le.NUM):
                     if l1 == l0:
                         continue
                     for f1 in loop_tiles[l1]:
@@ -370,6 +371,7 @@ def current_level_partition_blocking_1d(loop_tiles, slb, para_count, layer, u_th
 
 def current_level_partition_blocking_1d_with_hint(loop_tiles, slb, para_count, layer, level, cur_loop, schedule,
                                                   u_threshold):
+    
     hint = schedule.schedule_hint
     partition_loops = schedule.partition_loops
     para_permutation = []
@@ -440,7 +442,7 @@ def current_level_partition_blocking_2d_with_hint(loop_tiles, slb, para_count, l
         slp0, slp1 = slps
         para_index0, para_index1 = para_index_generator.next()
         if set(para_index0[0]).isdisjoint(set(para_index1[0])):
-            combined_slp = [a * b for a, b in zip(slp0, slp1)]
+            combined_slp = [a * b for a, b in list(zip(slp0, slp1))]
             para_permutation.append(combined_slp)
             combined_dim = [para_index0[0], para_index1[0]]
             para_dim_permutation.append(combined_dim)
@@ -460,7 +462,7 @@ def current_level_partition_blocking_2d(loop_tiles, slb, para_count, layer, u_th
         slp0, slp1 = slps
         para_index0, para_index1 = para_index_generator.next()
         if set(para_index0[0]).isdisjoint(set(para_index1[0])):
-            combined_slp = [a * b for a, b in zip(slp0, slp1)]
+            combined_slp = [a * b for a, b in list(zip(slp0, slp1))]
             para_permutation.append(combined_slp)
             combined_dim = [para_index0[0], para_index1[0]]
             para_dim_permutation.append(combined_dim)
@@ -471,7 +473,7 @@ def current_level_partition_blocking_2d(loop_tiles, slb, para_count, layer, u_th
 def current_level_partition_blocking(slb, para, layer, u_threshold, replication):
     para_count = para.array_width
     loop_tiles = []
-    for l in xrange(le.NUM):
+    for l in range(le.NUM):
         loop_tiles.append(bounded_factor(slb[l], para_count))
 
         # print "loop tile ", loop_tiles
@@ -484,7 +486,7 @@ def current_level_partition_blocking(slb, para, layer, u_threshold, replication)
 def current_level_partition_blocking_with_hint(slb, para, layer, level, schedule, u_threshold):
     para_count = para.array_width
     loop_tiles = []
-    for l in xrange(le.NUM):
+    for l in range(le.NUM):
         loop_tiles.append(bounded_factor(slb[l], para_count))
 
         # print "loop tile ", loop_tiles
@@ -510,7 +512,7 @@ def parallel_blocking_generator_function(lp, resource, layer, schedule=None):
 
     para_permutations = []
     para_dim_permutations = []
-    for level in xrange(num_level):
+    for level in range(num_level):
         if resource.paras[level].count == 1:
             para_permutations.append([[1] * le.NUM])
             para_dim_permutations.append([None])
@@ -545,7 +547,7 @@ def parallel_blocking_generator_function(lp, resource, layer, schedule=None):
 
     para_dim_generator = para_dim_generator_function(para_dim_permutations)
     for partition in itertools.product(*para_permutations):
-        para_dim = para_dim_generator.next()
+        para_dim = next(para_dim_generator)
         # print partition, para_dim
         yield [partition, para_dim]
 
@@ -570,39 +572,39 @@ def blocking_partitioning_generator_function(resource, layer, schedule, verbose=
 
     for loop_blocking in blocking_generator:
         if verbose == 3:
-            print "loop_tilling: ", loop_blocking
+            print("loop_tilling: ", loop_blocking)
 
-        loop_blocking_reshape = zip(*loop_blocking)
+        loop_blocking_reshape = list(zip(*loop_blocking))
         pb_generator = parallel_blocking_generator_function(loop_blocking_reshape, resource, layer, schedule)
 
         for pi in pb_generator:
             partition, para_dim = pi
             partitioned_loop_blocking_reshape = []
-            for level in xrange(num_level):
+            for level in range(num_level):
                 partitioned_loop_blocking_reshape.append(
-                    [(x + y - 1) // y for x, y in zip(loop_blocking_reshape[level], partition[level])])  # TODO check if using two maps with floordiv is faster
-            blocking_list = zip(*partitioned_loop_blocking_reshape)
-            partitioning_list = zip(*partition)
+                    [(x + y - 1) // y for x, y in list(zip(loop_blocking_reshape[level], partition[level]))])  # TODO check if using two maps with floordiv is faster
+            blocking_list = list(zip(*partitioned_loop_blocking_reshape))
+            partitioning_list = list(zip(*partition))
 
             if verbose == 3:
-                print "loop_blocking: ", blocking_list
-                print "loop_partition: ", partitioning_list
-                print "para_dimension: ", para_dim
+                print("loop_blocking: ", blocking_list)
+                print("loop_partition: ", partitioning_list)
+                print("para_dimension: ", para_dim)
 
             dummy_mapping_point = MappingPoint(None, blocking_list, partitioning_list, para_dim)
             if cost_model.valid_partitioning(resource, dummy_mapping_point, layer, verbose):
 #                if cost_model.valid_mapping_point(resource, dummy_mapping_point, layer, verbose):
                 if verbose == 3:
-                    print "Valid"
-                    print ""
+                    print("Valid")
+                    print("")
                 yield [blocking_list, partitioning_list, para_dim]
 #                else:
 #                   print "invalid"
 #                    print ""
             else:
                 if verbose == 3:
-                    print "invalid"
-                    print ""
+                    print("invalid")
+                    print("")
 
 
 def opt_get_best_loop_order(resource, layer, point, verbose=False):
@@ -637,7 +639,7 @@ def opt_get_best_loop_order(resource, layer, point, verbose=False):
 
     best_cost = 0
     para_level = 0
-    for level in xrange(num_levels):
+    for level in range(num_levels):
         smallest_cost = float("inf")
         # LMEI later, might can speed up the exhaustive order search by identifying symmetrical terms,
         #  e.g. ox and oy, fx and fx, to remove some similar orders
@@ -645,7 +647,7 @@ def opt_get_best_loop_order(resource, layer, point, verbose=False):
         for curr_level_order in level_order_generator_function(point, le.NUM, non_empty_loops, level):
             dummy_loop_order = [[0] * le.NUM] * num_levels
             dummy_loop_order[level] = curr_level_order
-            mapping_point = MappingPoint(zip(*dummy_loop_order), blocking, partitioning, para_dim)
+            mapping_point = MappingPoint(list(zip(*dummy_loop_order)), blocking, partitioning, para_dim)
             if level <= 0 or resource.paras[level - 1].count <= 1 \
                     or resource.paras[level - 1].access_mode < 1:  # don't get it
                 curr_cost = cost_model.get_level_cost(resource, mapping_point, layer, level, verbose)
@@ -656,9 +658,9 @@ def opt_get_best_loop_order(resource, layer, point, verbose=False):
                 smallest_cost = curr_cost
 
             if verbose >= 3:
-                print  "Level", level, "Current order:", curr_level_order, "     Best order:", best_curr_level_order
-                print  "Level", level, "Current energy:", '%20d' % curr_cost, "     Best energy:", '%20d' % smallest_cost
-                print  ""
+                print("Level", level, "Current order:", curr_level_order, "     Best order:", best_curr_level_order)
+                print("Level", level, "Current energy:", '%20d' % curr_cost, "     Best energy:", '%20d' % smallest_cost)
+                print("")
 
             # LMEI later, instead of using mac_capacity, we could use 4-level memory model, treat mac_capacity
             #  as the innermost memory level for output.
@@ -668,7 +670,7 @@ def opt_get_best_loop_order(resource, layer, point, verbose=False):
         best_loop_order.append(best_curr_level_order)
         best_cost += smallest_cost
 
-    return best_cost, zip(*best_loop_order)
+    return best_cost, list(zip(*best_loop_order))
 
 
 def opt_mapping_point_generator_function(resource, layer, schedule=None, verbose=False):
@@ -696,7 +698,7 @@ def opt_mapping_point_generator_function(resource, layer, schedule=None, verbose
            an invalid blocking_partitioning 
         '''
         if verbose >= 2:
-            print "Find best order for schedule: ", blocking_partitioning
+            print("Find best order for schedule: ", blocking_partitioning)
         [blocking, partitioning, para_dim] = blocking_partitioning
         dummy_mapping_point = MappingPoint(None, blocking, partitioning, para_dim)
         # print "blocking_partitioning: ", blocking_partitioning
@@ -709,9 +711,9 @@ def opt_mapping_point_generator_function(resource, layer, schedule=None, verbose
             perf = ideal_perf / utilization
 
             if verbose >= 2:
-                print "best loop order: ", best_mapping_point.loop_orders
-                print "Update smallest cost: ", smallest_cost
-                print "Update best schedule: ", utils.print_loop_nest(best_mapping_point)
+                print("best loop order: ", best_mapping_point.loop_orders)
+                print("Update smallest cost: ", smallest_cost)
+                print("Update best schedule: ", utils.print_loop_nest(best_mapping_point))
     assert best_mapping_point, "No valid mapping point found."
     return smallest_cost, perf, best_mapping_point
 
@@ -755,7 +757,7 @@ def partitioned_loop_string(partitioning, parallel_levels, para_dim):
     res = ""
 
     utilized = 1
-    partitioning_reshape = zip(*partitioning)
+    partitioning_reshape = list(zip(*partitioning))
     for level in parallel_levels:
         for para_idx in para_dim[level]:
             res += "("
@@ -769,7 +771,7 @@ def partitioned_loop_string(partitioning, parallel_levels, para_dim):
 
 def get_utilization(utilized, resource):
     # utilized = 1
-    # for i in xrange(len(partitioning)):
+    # for i in range(len(partitioning)):
     #    utilized *= reduce(mul, partitioning[i], 1)
 
     total = resource.total_parallelism()
@@ -805,7 +807,7 @@ def dataflow_exploration(resource, layer, file_name, verbose=False):
            an invalid blocking_partitioning 
         '''
         if verbose >= 2:
-            print "Find best order for schedule: ", blocking_partitioning
+            print("Find best order for schedule: ", blocking_partitioning)
         [blocking, partitioning, para_dim] = blocking_partitioning
         dummy_mapping_point = MappingPoint(None, blocking, partitioning, para_dim)
         # print "partitioning: ", partitioning
@@ -818,11 +820,11 @@ def dataflow_exploration(resource, layer, file_name, verbose=False):
             best_mapping_point = MappingPoint(loop_order, blocking, partitioning, para_dim)
             dataflow_tb[unrolled_loops] = (cost, utilization, best_mapping_point)  # TODO utilization
             if verbose:
-                print "unrolled loops: ", unrolled_loops, " with utilization ", utilization
+                print("unrolled loops: ", unrolled_loops, " with utilization ", utilization)
                 # print "best loop order: ", best_mapping_point.loop_orders
-                print "blocking: ", blocking
-                print "partitioning: ", partitioning
-                print "Update smallest cost: ", dataflow_tb[unrolled_loops][0]
+                print("blocking: ", blocking)
+                print("partitioning: ", partitioning)
+                print("Update smallest cost: ", dataflow_tb[unrolled_loops][0])
                 # print "Update best shedule: ", utils.print_loop_nest(best_mapping_point)
     # assert best_mapping_point, "No valid mapping point found."
     pickle_file_name = file_name + ".pickle"
diff --git a/cnn_mapping/mapping_point_generator.pyc b/cnn_mapping/mapping_point_generator.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..26ca62119f6d14870f957b47fde98fe2736df37a
GIT binary patch
literal 25156
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

literal 0
HcmV?d00001

diff --git a/cnn_mapping/optimizer.py b/cnn_mapping/optimizer.py
index c2ddff0..3886d7a 100644
--- a/cnn_mapping/optimizer.py
+++ b/cnn_mapping/optimizer.py
@@ -1,11 +1,11 @@
 '''
 Top level function of optimization framework
 '''
-import mapping_point_generator
-import cost_model
+from . import mapping_point_generator
+from . import cost_model
 
-import loop_enum as le
-import buffer_enum as be 
+from . import loop_enum as le
+from . import buffer_enum as be 
 
 def opt_optimizer(resource, layer, hint=None, verbose=False):
     '''
@@ -20,9 +20,9 @@ def opt_optimizer(resource, layer, hint=None, verbose=False):
     # assert total_cost == smallest_cost
 
     if verbose:
-        print "Optimal energy (pJ): ", smallest_cost
-        print "Runtime (cycles):", perf
-        print "Best mapping_point: ", best_mapping_point.loop_blockings, best_mapping_point.loop_partitionings, best_mapping_point.loop_orders
+        print("Optimal energy (pJ): ", smallest_cost)
+        print("Runtime (cycles):", perf)
+        print("Best mapping_point: ", best_mapping_point.loop_blockings, best_mapping_point.loop_partitionings, best_mapping_point.loop_orders)
     return [smallest_cost, best_mapping_point, perf]
  
 def optimizer(resource, layer, hint=None, verbose=False):
@@ -43,13 +43,13 @@ def optimizer(resource, layer, hint=None, verbose=False):
             smallest_cost = cost
             best_mapping_point = mapping_point
             if verbose:
-                print "Current smallest cost: ", smallest_cost
-                print "Current best mapping_point: ", mapping_point.loop_blockings, mapping_point.loop_orders
+                print("Current smallest cost: ", smallest_cost)
+                print("Current best mapping_point: ", mapping_point.loop_blockings, mapping_point.loop_orders)
     #print counter
     
     if verbose:
-        print smallest_cost
-        print "Best mapping_point: ", best_mapping_point.loop_blockings, mapping_point.loop_partitionings, best_mapping_point.loop_orders
+        print(smallest_cost)
+        print("Best mapping_point: ", best_mapping_point.loop_blockings, mapping_point.loop_partitionings, best_mapping_point.loop_orders)
 
     return [smallest_cost, best_mapping_point] 
 
diff --git a/cnn_mapping/optimizer.pyc b/cnn_mapping/optimizer.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..42e92656363243f26ded6a1833996f8c20a3c729
GIT binary patch
literal 1752
zcmb_cOOG2x5UzQ6*6VnAL`19vkp_u_ql8$>1!;vKBETXJ8)-lSS%J}b++)vf&-83}
z&jur#%W}z)AHx}b6Z`=9s_ijrq=-xAQB$w3uB!fOg1?RizyA40p40XU@O_Ned<QZk
znt*yV^GSL%0kh$Kn)n?b&?M~m9!(;47JZrp^b6b$J27<PfW@yzJ>KCV$lx2*#8O-d
z85eDx+fvoBDq_{xvMPVdoLuOv63>;s7?gkGI?F>WJjBaUp5Qe<gIJ<-k5)u0P@h%-
zU5E56pmj*=9<3v?KAi`&ikt({bwJO2S|8B5&(8XiYdBqnbowPyJYDse3BW{j4kdq}
z;!gxijeSBFtVi<z6>(0c02#!%KEKLjn^_Utg@|)yEEgrRd=Xb!)0Fi*Zd6&@2hLfG
zT<Mu}-C9#;jh~lx;nb$eq!ft4q1+mC2U|VmE@d(nwb1irJZiqWcM_X7VM*E=CJ~SF
zWsZgSPRv`-e##;Cwm6AL2Qb*TLG}#koP%aoY5P8GIFIxt_Ov@UJAfl6m{w{gq!Z`D
zrdgf~W9)0NN~M}~Dph`g78rZGQ#F~kC7-oZ-|E!piqK}nM{WBcS{T*pTv$GMnJtC3
z-1Y@JX}OFmp{L3Sdj!5~S;`qXw?^o~Z8=37_N%eH<tEQmmhk6NGOe?vTRwtBj+jrt
zjTfpC<JKUz@wCcwC9AOzk3M|#0TO}I3Mn%^&g;6{WxU0+&<~rXOOG46Q}S+x`$N%t
z-aEa>JH&n0+u=Nd#o_#SFu*y0dhIc=tw-m8`ab4?_8$uZen0#E2Z#HB0nAPt=)1uH
z?pJt1x<Fg+Gmmg^*bc)B9@FhGY-ivG_%C13<$Zp><-z%l!(di;Ncy`WIoL=yW~EQ_
zZuHMA|7Oa%FbupWt=6Kpad%`6<pA=#H*9=n|Ap?$G0k9cAStBEYyydF4Dx>vPJH&{
z)eKxlPQn07_y7_Hox@_nSWDO|VQ40Nd<i4S4neBs#_TW>_cnD%bb;CAFy+WA0TySo
z0~L4AwUGRwcN`x1$GxE!xf|dLBCqG&^+zskt|v`rDo<0_t4$j?nj2VAw-tV#kc1nQ
zX<HORr#tmjxT?-ny_w7}GHFEe1{Ng8ApaKm>MHFc?nn5|v{HP`P%_;4$Qyb?6g%`^
Gzx@yIRIzga

literal 0
HcmV?d00001

diff --git a/cnn_mapping/resource.py b/cnn_mapping/resource.py
index adbbf6f..8200893 100644
--- a/cnn_mapping/resource.py
+++ b/cnn_mapping/resource.py
@@ -5,6 +5,7 @@ Hardware resource types.
 from collections import namedtuple
 from operator import mul
 import math
+from functools import reduce
 
 class Buffer(namedtuple('Buffer',
                         ['capacity', 'access_cost', 'unit_static_cost'])):
@@ -91,11 +92,11 @@ class Resource(object):
             partition_mode = [0] * len(para_count_list)
         else :
             array_level = 0
-            for i in xrange(self.num_levels):
+            for i in range(self.num_levels):
                 # when using non-default partition mode, the parallelism
                 # count needs to be large than 1
-                assert partition_mode[i] == 0 or para_count_list <= 1 \
-                       or (partition_mode[i] > 0 and para_count_list > 1)
+                assert partition_mode[i] == 0 or para_count_list[i] <= 1 \
+                       or (partition_mode[i] > 0 and para_count_list[i] > 1)
                 if partition_mode[i] == 1 or partition_mode[i] == 2:
                     array_access_costs[i] = array_access_cost[array_level]
                     array_level += 1
@@ -109,7 +110,7 @@ class Resource(object):
             array_dim = [2 if e != 1 else 1 for e in para_count_list]
 
         # LMEI always assume square-shape array, could change later
-        array_width = [para_count_list[i] if array_dim[i] == 1 else int(math.sqrt(para_count_list[i])) for i in xrange(self.num_levels)]
+        array_width = [para_count_list[i] if array_dim[i] == 1 else int(math.sqrt(para_count_list[i])) for i in range(self.num_levels)]
  
         self.paras = [Parallelism(*t) for t in zip(para_count_list, \
             partition_mode, array_access_costs, array_dim, array_width)]
diff --git a/cnn_mapping/resource.pyc b/cnn_mapping/resource.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..463d3443d75ee556d8374634ce93afbf96dee89d
GIT binary patch
literal 6605
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
Rd1v04L7;ng4&m_a{{W2EgyaAK

literal 0
HcmV?d00001

diff --git a/cnn_mapping/schedule.py b/cnn_mapping/schedule.py
index cdfdb21..9ef6445 100644
--- a/cnn_mapping/schedule.py
+++ b/cnn_mapping/schedule.py
@@ -2,7 +2,7 @@
 Schedule hint
 '''
 
-import loop_enum as le
+from . import loop_enum as le
 
 class Schedule(object):
     '''
@@ -26,10 +26,10 @@ class Schedule(object):
         else:
             self.partition_loops = partition_loops       
 
-        num_levels = len(schedule_hint.values()[0])
+        num_levels = len(list(schedule_hint.values())[0][0])
         hint_para_index = {}
         for loop in schedule_hint:
-            for level in xrange(num_levels):
+            for level in range(num_levels):
                 if schedule_hint[loop][level] != None and schedule_hint[loop][level][2] != None:
                     if level not in hint_para_index:
                         hint_para_index[level] = [loop]
diff --git a/cnn_mapping/schedule.pyc b/cnn_mapping/schedule.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..39c0af312b808f473051ef4b2f9bd6ca26c020df
GIT binary patch
literal 1818
zcmb_d&2Aev5T0HAMQV%&2ok_R8}L#<2Al|S4h4+BFd84)ix2CAQ5yoW+8tT6x#W6D
zIdUQ$g5=<9-l$K}2k5cK_5sovuB1dgdx0Gdhn)H5=i{pJ?^f^gKYwHyET0Db9@6V}
zN#p=$BqPXU&=H))kT(DuFeXbAJ^_3L`2DQO+b8`Ndwox$calvopK25nWqeP4q375?
zpq<sm8Z9Q{FYLEN0tt-*lMFZn`-w1{fGq}KG+MSHIq5gq<*$gK1U+sECmC*Eyw}#2
zLYW+A`{(CjVXGXg-Jp)N&90QWs8?lLdF7QgWD$qrrSn4L4Qf$fG2A^r6niG$u)L~r
z@nSe!1Yic=2+9WW{6GkgMQN*4*V|6L!%c?`Ty}6}>eaXBMSo?Qn#yX;2@VALrCOs_
zuGr~?kn2d2GjaREPcWc5@phuJiAXCH<YV7rF1!^Z6cv_QWvM4a-x@NO!j6Mqj$>uW
z9Ew^;Cg`1Y`k};?pm?e%D|>_D*Hba|N~?ENhc$I>JP*k!%X%8(J+-xN=e{^!)~9bp
zUEvBhoJF_namIvX?zHKB!*l;aVjjU9K$1dK0k~>F^&4E!l8iCTUb6jY_#-SDY`To$
zvH`vcmo1n#V4HXpUH=59rpxDQAK&JnmmQ`wF^|tInxFs{Etq}ay`$kREZQ(Dfw(+x
zG8>PEBUp4oHf`9RcVK&&%-x19{?<;%TX5BZ>Q9)r;eraGq&o2W`tPN-O}WxeNb(M@
z@8I-$3a5OEitBQ@Cw*?pF(n6}_zLxVB>WbMjk`b<(=lt%^R-;hvt|kv43L&3n%r{?
zjh>_M=%r6bv}6#CCLFv;^%PxDXH{x0>X82%aG&QCKppCFLiZCA4&qtUA-tIuGTbni
zgq%4;hV=aP2pfG;AP9Fr+F)V}984WnZZImc%<5u*xcBqkb0QZRJ!+j+gUlFNP&LHW
z!Kw!@%G>bOkwib`rF=}`+%pazccX_<H`<Dx#ohR6)F$n5v`e-}@efhP-QbsVdqb~#
zLV}u49AIYf4^8wVfAhi|z7|^N&c2~}nRcNY%8c#(m$fRBBRj@~__*I;><1*IG--iS
zhOSFlSpFc>k`G9k+f2%YosviF@g0dwr_L4VCpJ&GRbMj>+C5Aop{T$KIOblv*Nz`P
s34a^OQ(F5ji9kOjmLyDwz&AU(#LNfZ`%fwK>UG_n1D>YisZ(O{e~Ylbng9R*

literal 0
HcmV?d00001

diff --git a/cnn_mapping/utils.py b/cnn_mapping/utils.py
index 520d37c..b1d79b8 100644
--- a/cnn_mapping/utils.py
+++ b/cnn_mapping/utils.py
@@ -1,16 +1,16 @@
-import loop_enum as le
-import buffer_enum as be
+from . import loop_enum as le
+from . import buffer_enum as be
 
 def print_loop_nest(point):
-    loop_orders = zip(*point.loop_orders)
-    loop_blockings = zip(*point.loop_blockings)
-    loop_partitionings = zip(*point.loop_partitionings)
+    loop_orders = list(zip(*point.loop_orders))
+    loop_blockings = list(zip(*point.loop_blockings))
+    loop_partitionings = list(zip(*point.loop_partitionings))
     para_dims = point.para_loop_dim
     num_level = len(loop_orders)
     order_lists = []
-    for level in xrange(num_level):
+    for level in range(num_level):
         order_list = [None] * le.NUM
-        for order in xrange(le.NUM):
+        for order in range(le.NUM):
             if loop_blockings[level][order] != 1 or loop_partitionings[level][order] != 1 :
                 order_list[loop_orders[level][order]] = (le.table[order], 
                                                         loop_blockings[level][order],
@@ -18,5 +18,5 @@ def print_loop_nest(point):
                 
         order_lists.append(order_list) 
 
-    print order_lists, para_dims
+    print(order_lists, para_dims)
 
diff --git a/cnn_mapping/utils.pyc b/cnn_mapping/utils.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c1e5298fb725ac5ed6c4d698976cfb8efb71495e
GIT binary patch
literal 919
zcmb_Zy>8S%5T3PtKfb$=KoC+IDv;cOr8E>o2nnRnaD}4?DH5{$vv>HiUOV1BbRl*H
zB@Hc40B^xF!2`g|99BZl+WRx#%<O#gt@~?d^5y4`EQ7zp!TmW-^AMLDe*p^MO!Q|5
z&RobH_=KQG-jl$^$l^DSc_#2U!8yYD0;d5)EI<pe67U(I6TRuM>GY<{rpu8YbRO6N
zv;sZ~=mxOF#35|HfgM6SAn@heuh5N%)DmwT!^(%d-555OLbf(XWzhN1I?#^bp!MMZ
z37@-QzC(+p{=u3n&YJ**-N?8RxWJq-vFbCAF0KIoH|-EsQ}SU=adFDPaqGeHD<pUl
zkf!s3v<YUoSQ6|*QQIl*s;cU^YI4~ad#kroRb}UeUK)F+hw7xUg)J)0@D9R=Br&Jw
zMag$6sj+*2O_S)Qv>qPkm6n$3E6E}A)7L00a!67{C^)HWsq=tdjXiZ$Xd4mPi1H#L
zYkgd}9+om}>2(<^`CcmSf*XicVXWaxwjR3k+QSYu1H^$B^Au0vyQ-Ao+MonsT4q_L
z%23L~Cx?%a3F#u0N}4d!Ixdkd3J|Vsq0Hm@((Yn@-C*2S2`vq`ZSGSEvCE$?W@0Gz
z#h$n)0x=O&@xZz51S|tJ#u`d&C>o>1{iN%~LN+mhtX?Xkee_)u|3B=h-cecQYbBqN
L;)b4VCT7kbtBlIz

literal 0
HcmV?d00001

diff --git a/tools/run_optimizer.py b/tools/run_optimizer.py
index e785a16..e4469e0 100644
--- a/tools/run_optimizer.py
+++ b/tools/run_optimizer.py
@@ -16,9 +16,10 @@ def basic_optimizer(arch_info, network_info, schedule_info=None, basic=False, ve
     
     level_costs = cm.cost_model.get_level_costs(resource, best_mapping_point, layer, verbose)
     if verbose or basic:
-        print "best energy: ", smallest_cost
-        print "cost for each level: ", level_costs #TODO
-        print "best schedule: ", cm.utils.print_loop_nest(best_mapping_point)
+        print("best energy: ", smallest_cost)
+        print("cost for each level: ", level_costs) #TODO
+        print("best schedule: ")
+        print(cm.utils.print_loop_nest(best_mapping_point))
     return smallest_cost, perf
 
 
@@ -46,7 +47,7 @@ def mem_explore_optimizer(arch_info, network_info, schedule_info, verbose=False)
             #    continue
             arch_info["capacity"][1] = capacity1 * (arch_info["capacity_scale"][1]**y)
             arch_info["access_cost"][1] = cost1 * (arch_info["access_cost_scale"][1]**y)
-            print arch_info
+            print(arch_info)
             energy, perf = basic_optimizer(arch_info, network_info, schedule_info, False, verbose)
             energy_list[x][y] = energy
             cur_point = network_info["layer_info"] + arch_info["capacity"][:-1] + [energy]
@@ -54,8 +55,8 @@ def mem_explore_optimizer(arch_info, network_info, schedule_info, verbose=False)
 #            np.savetxt(output_filename, summary_array, delimiter=",")
             i += 1
 
-    print list(energy_list)
-    print "optiaml energy for all memory systems: ", np.min(np.array(energy_list))
+    print(list(energy_list))
+    print("optimal energy for all memory systems: ", np.min(np.array(energy_list)))
 
 def mac_explore_optimizer(arch_info, network_info, schedule_info, verbose=False):
     
@@ -68,7 +69,7 @@ def mac_explore_optimizer(arch_info, network_info, schedule_info, verbose=False)
         dataflow_res.append[energy]
         
     if verbose:
-        print "optimal energy for all dataflows: ", dataflow_res
+        print("optimal energy for all dataflows: ", dataflow_res)
 
     return dataflow_res
 
@@ -83,12 +84,64 @@ def dataflow_explore_optimizer(arch_info, network_info, file_name, verbose=False
     dataflow_tb = cm.mapping_point_generator.dataflow_exploration(resource, layer, file_name, verbose)
     
     if verbose:
-        print "dataflow table done "
+        print("dataflow table done ")
+
+def mem_explore_optimizer_4_level(arch_info, network_info, schedule_info, verbose=False):
+    assert "explore_points" in arch_info, "missing explore_points in arch file" 
+    assert "capacity_scale" in arch_info, "missing capacity_scale in arch file" 
+    assert "access_cost_scale" in arch_info, "missing access_cost_scale in arch file" 
+    cwd = os.getcwd()
+#    output_filename = os.path.join(cwd, "dataset", network_info['layer_name'] + '_128.csv')
+    explore_points = arch_info["explore_points"]
+    energy_list = np.zeros(tuple(explore_points))
+    summary_array = np.zeros([np.product(explore_points), 13])
+    capacity0 = arch_info["capacity"][0]
+    capacity1 = arch_info["capacity"][1]
+    capacity2 = arch_info["capacity"][2]
+    cost0 = arch_info["access_cost"][0]
+    cost1 = arch_info["access_cost"][1]
+    cost2 = arch_info["access_cost"][2]
+    i = 0
+    for x in xrange(explore_points[0]):
+        arch_info["capacity"][0] = capacity0 * (arch_info["capacity_scale"][0]**x)
+        arch_info["access_cost"][0] = cost0 * (arch_info["access_cost_scale"][0]**x)
+        for y in xrange(explore_points[1]):
+            arch_info["capacity"][1] = capacity1 * (arch_info["capacity_scale"][1]**y)
+            arch_info["access_cost"][1] = cost1 * (arch_info["access_cost_scale"][1]**y)
+            for z in xrange(explore_points[2]):
+                arch_info["capacity"][2] = capacity2 * (arch_info["capacity_scale"][2]**z)
+                arch_info["access_cost"][2] = cost2 * (arch_info["access_cost_scale"][2]**z)
+                print(arch_info)
+                
+                # TODO: Calculate the area of the design
+                # total_area = sum(area(MAC)) + sum(2 * area(register file)) + 2 * area(buffer)
+                area = (2 * (arch_info["capacity"][0] + arch_info["capacity"][1] + arch_info["capacity"][2]) \
+                        + 2 * arch_info["capacity"][3]) / 1e9
+                
+                print("Area: ", area)
+                if area > 2:
+                    energy_list[x][y][z] = np.nan
+                    print("INFO: Architecture does not fulfill area constraint.")
+                    continue
+                try:
+                    energy, perf = basic_optimizer(arch_info, network_info, schedule_info, False, verbose)
+                    energy_list[x][y][z] = energy
+                    cur_point = network_info["layer_info"] + arch_info["capacity"][:-1] + [energy]
+                    summary_array[i] = cur_point
+    #            np.savetxt(output_filename, summary_array, delimiter=",")
+                    i += 1
+                except Exception as e:
+                    energy_list[x][y][z] = np.nan
+                    print("WARNING: No valid mapping point found.")
+                print("=" * 80)
+
+    print(list(energy_list))
+    print("optimal energy for all memory systems: ", np.nanmin(np.array(energy_list)))
 
 
 if __name__ == "__main__":
     parser = argparse.ArgumentParser()
-    parser.add_argument("type", choices=["basic", "mem_explore", "dataflow_explore"], help="optimizer type")
+    parser.add_argument("type", choices=["basic", "mem_explore", "dataflow_explore", "mem_explore_4"], help="optimizer type")
     parser.add_argument("arch", help="architecture specification")
     parser.add_argument("network", help="network specification")
     parser.add_argument("-s", "--schedule", help="restriction of the schedule space")
@@ -117,6 +170,8 @@ if __name__ == "__main__":
         mem_explore_optimizer(arch_info, network_info, schedule_info, args.verbose)
     elif args.type == "dataflow_explore":
         dataflow_explore_optimizer(arch_info, network_info, args.name, args.verbose)
+    elif args.type == "mem_explore_4":
+        mem_explore_optimizer_4_level(arch_info, network_info, schedule_info, args.verbose)
     end = time.time()
-    print "elapsed time: ", (end-start)
+    print("elapsed time: ", (end-start))
 
-- 
GitLab