Commit 03d45283 by sakundu

Added proxy cost documentation

Signed-off-by: sakundu <sakundu@ucsd.edu>
parent 50e6766e
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
<style type="text/css">ol.lst-kix_8wbl4tsmsea1-5.start{counter-reset:lst-ctn-kix_8wbl4tsmsea1-5 0}.lst-kix_kha5qfkechm0-0>li{counter-increment:lst-ctn-kix_kha5qfkechm0-0}.lst-kix_uet2thjh9w7v-6>li{counter-increment:lst-ctn-kix_uet2thjh9w7v-6}ol.lst-kix_nurf0486bu14-0{list-style-type:none}.lst-kix_jyurzd4jvnuk-1>li{counter-increment:lst-ctn-kix_jyurzd4jvnuk-1}ol.lst-kix_nurf0486bu14-1{list-style-type:none}ol.lst-kix_nurf0486bu14-2{list-style-type:none}ol.lst-kix_nurf0486bu14-3{list-style-type:none}ol.lst-kix_m38g95t6y81f-7.start{counter-reset:lst-ctn-kix_m38g95t6y81f-7 0}ol.lst-kix_j8b5qmagvguq-4.start{counter-reset:lst-ctn-kix_j8b5qmagvguq-4 0}ol.lst-kix_nurf0486bu14-4{list-style-type:none}ol.lst-kix_nurf0486bu14-5{list-style-type:none}ol.lst-kix_nurf0486bu14-6{list-style-type:none}ol.lst-kix_nurf0486bu14-7{list-style-type:none}ol.lst-kix_nurf0486bu14-8{list-style-type:none}ol.lst-kix_nurf0486bu14-4.start{counter-reset:lst-ctn-kix_nurf0486bu14-4 0}.lst-kix_hp102ryw7avj-8>li:before{content:"" counter(lst-ctn-kix_hp102ryw7avj-8,lower-roman) ". "}.lst-kix_j8b5qmagvguq-5>li{counter-increment:lst-ctn-kix_j8b5qmagvguq-5}.lst-kix_hp102ryw7avj-4>li:before{content:"" counter(lst-ctn-kix_hp102ryw7avj-4,lower-latin) ". "}.lst-kix_hp102ryw7avj-5>li:before{content:"" counter(lst-ctn-kix_hp102ryw7avj-5,lower-roman) ". "}.lst-kix_hp102ryw7avj-2>li:before{content:"" counter(lst-ctn-kix_hp102ryw7avj-2,lower-roman) ". "}.lst-kix_hp102ryw7avj-3>li:before{content:"" counter(lst-ctn-kix_hp102ryw7avj-3,decimal) ". "}.lst-kix_hp102ryw7avj-6>li:before{content:"" counter(lst-ctn-kix_hp102ryw7avj-6,decimal) ". "}.lst-kix_hp102ryw7avj-7>li:before{content:"" counter(lst-ctn-kix_hp102ryw7avj-7,lower-latin) ". "}ol.lst-kix_hp102ryw7avj-8.start{counter-reset:lst-ctn-kix_hp102ryw7avj-8 0}.lst-kix_wz0jpb95pupm-3>li{counter-increment:lst-ctn-kix_wz0jpb95pupm-3}ol.lst-kix_kha5qfkechm0-5.start{counter-reset:lst-ctn-kix_kha5qfkechm0-5 0}.lst-kix_taizt4vy16t3-0>li{counter-increment:lst-ctn-kix_taizt4vy16t3-0}ol.lst-kix_taizt4vy16t3-5.start{counter-reset:lst-ctn-kix_taizt4vy16t3-5 0}ol.lst-kix_vqm3flmi6t74-0{list-style-type:none}ol.lst-kix_vqm3flmi6t74-4.start{counter-reset:lst-ctn-kix_vqm3flmi6t74-4 0}ol.lst-kix_m38g95t6y81f-2.start{counter-reset:lst-ctn-kix_m38g95t6y81f-2 0}ol.lst-kix_vqm3flmi6t74-5{list-style-type:none}ol.lst-kix_vqm3flmi6t74-6{list-style-type:none}.lst-kix_j8b5qmagvguq-1>li{counter-increment:lst-ctn-kix_j8b5qmagvguq-1}ol.lst-kix_vqm3flmi6t74-7{list-style-type:none}ol.lst-kix_vqm3flmi6t74-8{list-style-type:none}ol.lst-kix_vqm3flmi6t74-1{list-style-type:none}ol.lst-kix_vqm3flmi6t74-2{list-style-type:none}ol.lst-kix_vqm3flmi6t74-3{list-style-type:none}ol.lst-kix_vqm3flmi6t74-4{list-style-type:none}.lst-kix_f3p13gvgfnks-6>li{counter-increment:lst-ctn-kix_f3p13gvgfnks-6}.lst-kix_jyurzd4jvnuk-5>li{counter-increment:lst-ctn-kix_jyurzd4jvnuk-5}ol.lst-kix_wz0jpb95pupm-0.start{counter-reset:lst-ctn-kix_wz0jpb95pupm-0 0}.lst-kix_8wbl4tsmsea1-5>li{counter-increment:lst-ctn-kix_8wbl4tsmsea1-5}.lst-kix_wz0jpb95pupm-7>li{counter-increment:lst-ctn-kix_wz0jpb95pupm-7}.lst-kix_73ql7qcq5tpa-3>li{counter-increment:lst-ctn-kix_73ql7qcq5tpa-3}.lst-kix_73ql7qcq5tpa-6>li{counter-increment:lst-ctn-kix_73ql7qcq5tpa-6}ol.lst-kix_jyurzd4jvnuk-6.start{counter-reset:lst-ctn-kix_jyurzd4jvnuk-6 0}.lst-kix_taizt4vy16t3-7>li{counter-increment:lst-ctn-kix_taizt4vy16t3-7}ol.lst-kix_kha5qfkechm0-0.start{counter-reset:lst-ctn-kix_kha5qfkechm0-0 0}.lst-kix_m38g95t6y81f-3>li{counter-increment:lst-ctn-kix_m38g95t6y81f-3}ol.lst-kix_hp102ryw7avj-3.start{counter-reset:lst-ctn-kix_hp102ryw7avj-3 0}.lst-kix_vqm3flmi6t74-5>li{counter-increment:lst-ctn-kix_vqm3flmi6t74-5}.lst-kix_vqm3flmi6t74-2>li{counter-increment:lst-ctn-kix_vqm3flmi6t74-2}ol.lst-kix_hp102ryw7avj-1.start{counter-reset:lst-ctn-kix_hp102ryw7avj-1 0}ol.lst-kix_m38g95t6y81f-8{list-style-type:none}ol.lst-kix_m38g95t6y81f-5{list-style-type:none}ol.lst-kix_m38g95t6y81f-4{list-style-type:none}ol.lst-kix_m38g95t6y81f-7{list-style-type:none}ol.lst-kix_m38g95t6y81f-6{list-style-type:none}ol.lst-kix_m38g95t6y81f-1{list-style-type:none}ol.lst-kix_m38g95t6y81f-0{list-style-type:none}ol.lst-kix_73ql7qcq5tpa-8{list-style-type:none}ol.lst-kix_m38g95t6y81f-3{list-style-type:none}ol.lst-kix_m38g95t6y81f-2{list-style-type:none}ol.lst-kix_73ql7qcq5tpa-5{list-style-type:none}ol.lst-kix_73ql7qcq5tpa-4{list-style-type:none}ol.lst-kix_73ql7qcq5tpa-7{list-style-type:none}ol.lst-kix_73ql7qcq5tpa-6{list-style-type:none}ol.lst-kix_73ql7qcq5tpa-1{list-style-type:none}ol.lst-kix_73ql7qcq5tpa-0{list-style-type:none}ol.lst-kix_73ql7qcq5tpa-3{list-style-type:none}ol.lst-kix_73ql7qcq5tpa-2{list-style-type:none}.lst-kix_taizt4vy16t3-4>li{counter-increment:lst-ctn-kix_taizt4vy16t3-4}ol.lst-kix_uet2thjh9w7v-2.start{counter-reset:lst-ctn-kix_uet2thjh9w7v-2 0}.lst-kix_8wbl4tsmsea1-2>li{counter-increment:lst-ctn-kix_8wbl4tsmsea1-2}.lst-kix_hp102ryw7avj-6>li{counter-increment:lst-ctn-kix_hp102ryw7avj-6}ol.lst-kix_wz0jpb95pupm-7.start{counter-reset:lst-ctn-kix_wz0jpb95pupm-7 0}.lst-kix_j8b5qmagvguq-1>li:before{content:"" counter(lst-ctn-kix_j8b5qmagvguq-1,lower-latin) ". "}ol.lst-kix_73ql7qcq5tpa-4.start{counter-reset:lst-ctn-kix_73ql7qcq5tpa-4 0}.lst-kix_j8b5qmagvguq-3>li:before{content:"" counter(lst-ctn-kix_j8b5qmagvguq-3,decimal) ". "}ol.lst-kix_f3p13gvgfnks-8.start{counter-reset:lst-ctn-kix_f3p13gvgfnks-8 0}.lst-kix_j8b5qmagvguq-7>li:before{content:"" counter(lst-ctn-kix_j8b5qmagvguq-7,lower-latin) ". "}.lst-kix_j8b5qmagvguq-5>li:before{content:"" counter(lst-ctn-kix_j8b5qmagvguq-5,lower-roman) ". "}.lst-kix_kha5qfkechm0-3>li{counter-increment:lst-ctn-kix_kha5qfkechm0-3}ol.lst-kix_kha5qfkechm0-3.start{counter-reset:lst-ctn-kix_kha5qfkechm0-3 0}.lst-kix_hp102ryw7avj-7>li{counter-increment:lst-ctn-kix_hp102ryw7avj-7}.lst-kix_uet2thjh9w7v-1>li:before{content:"" counter(lst-ctn-kix_uet2thjh9w7v-1,lower-latin) ". "}.lst-kix_uet2thjh9w7v-5>li:before{content:"" counter(lst-ctn-kix_uet2thjh9w7v-5,lower-roman) ". "}.lst-kix_hp102ryw7avj-0>li:before{content:"" counter(lst-ctn-kix_hp102ryw7avj-0,decimal) ". "}ol.lst-kix_8wbl4tsmsea1-0.start{counter-reset:lst-ctn-kix_8wbl4tsmsea1-0 0}.lst-kix_m38g95t6y81f-0>li:before{content:"" counter(lst-ctn-kix_m38g95t6y81f-0,decimal) ". "}.lst-kix_uet2thjh9w7v-7>li:before{content:"" counter(lst-ctn-kix_uet2thjh9w7v-7,lower-latin) ". "}.lst-kix_di30h54lh28-7>li:before{content:"\0025cb "}ol.lst-kix_taizt4vy16t3-8.start{counter-reset:lst-ctn-kix_taizt4vy16t3-8 0}.lst-kix_di30h54lh28-5>li:before{content:"\0025a0 "}ol.lst-kix_vqm3flmi6t74-1.start{counter-reset:lst-ctn-kix_vqm3flmi6t74-1 0}.lst-kix_6g1yosxwv97c-6>li:before{content:"\0025cf "}ol.lst-kix_m38g95t6y81f-5.start{counter-reset:lst-ctn-kix_m38g95t6y81f-5 0}.lst-kix_nurf0486bu14-6>li{counter-increment:lst-ctn-kix_nurf0486bu14-6}.lst-kix_uet2thjh9w7v-3>li:before{content:"" counter(lst-ctn-kix_uet2thjh9w7v-3,decimal) ". "}.lst-kix_6g1yosxwv97c-8>li:before{content:"\0025a0 "}.lst-kix_kha5qfkechm0-4>li{counter-increment:lst-ctn-kix_kha5qfkechm0-4}ul.lst-kix_di30h54lh28-1{list-style-type:none}ul.lst-kix_di30h54lh28-0{list-style-type:none}.lst-kix_m38g95t6y81f-8>li:before{content:"" counter(lst-ctn-kix_m38g95t6y81f-8,lower-roman) ". "}ul.lst-kix_8vc2vf5ikyh7-1{list-style-type:none}ul.lst-kix_8vc2vf5ikyh7-2{list-style-type:none}ul.lst-kix_8vc2vf5ikyh7-0{list-style-type:none}ul.lst-kix_di30h54lh28-7{list-style-type:none}ul.lst-kix_8vc2vf5ikyh7-5{list-style-type:none}ul.lst-kix_di30h54lh28-6{list-style-type:none}ul.lst-kix_8vc2vf5ikyh7-6{list-style-type:none}ul.lst-kix_8vc2vf5ikyh7-3{list-style-type:none}ul.lst-kix_di30h54lh28-8{list-style-type:none}.lst-kix_m38g95t6y81f-4>li:before{content:"" counter(lst-ctn-kix_m38g95t6y81f-4,lower-latin) ". "}.lst-kix_m38g95t6y81f-6>li:before{content:"" counter(lst-ctn-kix_m38g95t6y81f-6,decimal) ". "}ul.lst-kix_8vc2vf5ikyh7-4{list-style-type:none}ul.lst-kix_di30h54lh28-3{list-style-type:none}ul.lst-kix_di30h54lh28-2{list-style-type:none}ul.lst-kix_di30h54lh28-5{list-style-type:none}ul.lst-kix_8vc2vf5ikyh7-7{list-style-type:none}ul.lst-kix_di30h54lh28-4{list-style-type:none}ol.lst-kix_uet2thjh9w7v-4.start{counter-reset:lst-ctn-kix_uet2thjh9w7v-4 0}ul.lst-kix_8vc2vf5ikyh7-8{list-style-type:none}ol.lst-kix_73ql7qcq5tpa-6.start{counter-reset:lst-ctn-kix_73ql7qcq5tpa-6 0}.lst-kix_m38g95t6y81f-2>li:before{content:"" counter(lst-ctn-kix_m38g95t6y81f-2,lower-roman) ". "}.lst-kix_f3p13gvgfnks-5>li{counter-increment:lst-ctn-kix_f3p13gvgfnks-5}.lst-kix_taizt4vy16t3-6>li:before{content:"" counter(lst-ctn-kix_taizt4vy16t3-6,decimal) ". "}.lst-kix_8wbl4tsmsea1-7>li:before{content:"" counter(lst-ctn-kix_8wbl4tsmsea1-7,lower-latin) ". "}.lst-kix_vqm3flmi6t74-1>li:before{content:"" counter(lst-ctn-kix_vqm3flmi6t74-1,lower-latin) ". "}.lst-kix_vqm3flmi6t74-5>li:before{content:"" counter(lst-ctn-kix_vqm3flmi6t74-5,lower-roman) ". "}ol.lst-kix_m38g95t6y81f-4.start{counter-reset:lst-ctn-kix_m38g95t6y81f-4 0}.lst-kix_j8b5qmagvguq-4>li{counter-increment:lst-ctn-kix_j8b5qmagvguq-4}.lst-kix_vqm3flmi6t74-0>li:before{content:"" counter(lst-ctn-kix_vqm3flmi6t74-0,decimal) ". "}.lst-kix_vqm3flmi6t74-4>li:before{content:"" counter(lst-ctn-kix_vqm3flmi6t74-4,lower-latin) ". "}ol.lst-kix_jyurzd4jvnuk-2.start{counter-reset:lst-ctn-kix_jyurzd4jvnuk-2 0}.lst-kix_taizt4vy16t3-7>li:before{content:"" counter(lst-ctn-kix_taizt4vy16t3-7,lower-latin) ". "}.lst-kix_6taojj4n6yll-6>li:before{content:"\0025cf "}.lst-kix_6taojj4n6yll-5>li:before{content:"\0025a0 "}.lst-kix_8wbl4tsmsea1-3>li:before{content:"" counter(lst-ctn-kix_8wbl4tsmsea1-3,decimal) ". "}ol.lst-kix_73ql7qcq5tpa-8.start{counter-reset:lst-ctn-kix_73ql7qcq5tpa-8 0}ol.lst-kix_f3p13gvgfnks-1.start{counter-reset:lst-ctn-kix_f3p13gvgfnks-1 0}ol.lst-kix_vqm3flmi6t74-2.start{counter-reset:lst-ctn-kix_vqm3flmi6t74-2 0}.lst-kix_8wbl4tsmsea1-4>li:before{content:"" counter(lst-ctn-kix_8wbl4tsmsea1-4,lower-latin) ". "}.lst-kix_6taojj4n6yll-2>li:before{content:"\0025a0 "}ol.lst-kix_nurf0486bu14-7.start{counter-reset:lst-ctn-kix_nurf0486bu14-7 0}.lst-kix_6taojj4n6yll-1>li:before{content:"\0025cb "}ol.lst-kix_8wbl4tsmsea1-8.start{counter-reset:lst-ctn-kix_8wbl4tsmsea1-8 0}.lst-kix_f3p13gvgfnks-3>li{counter-increment:lst-ctn-kix_f3p13gvgfnks-3}ol.lst-kix_f3p13gvgfnks-7.start{counter-reset:lst-ctn-kix_f3p13gvgfnks-7 0}.lst-kix_kha5qfkechm0-1>li{counter-increment:lst-ctn-kix_kha5qfkechm0-1}.lst-kix_taizt4vy16t3-3>li:before{content:"" counter(lst-ctn-kix_taizt4vy16t3-3,decimal) ". "}.lst-kix_73ql7qcq5tpa-1>li:before{content:"" counter(lst-ctn-kix_73ql7qcq5tpa-1,lower-latin) ". "}ol.lst-kix_f3p13gvgfnks-7{list-style-type:none}ol.lst-kix_f3p13gvgfnks-6{list-style-type:none}.lst-kix_73ql7qcq5tpa-2>li:before{content:"" counter(lst-ctn-kix_73ql7qcq5tpa-2,lower-roman) ". "}ol.lst-kix_f3p13gvgfnks-5{list-style-type:none}.lst-kix_taizt4vy16t3-2>li:before{content:"" counter(lst-ctn-kix_taizt4vy16t3-2,lower-roman) ". "}ol.lst-kix_f3p13gvgfnks-4{list-style-type:none}.lst-kix_8wbl4tsmsea1-0>li:before{content:"" counter(lst-ctn-kix_8wbl4tsmsea1-0,decimal) ". "}ol.lst-kix_f3p13gvgfnks-8{list-style-type:none}.lst-kix_73ql7qcq5tpa-5>li:before{content:"" counter(lst-ctn-kix_73ql7qcq5tpa-5,lower-roman) ". "}.lst-kix_73ql7qcq5tpa-6>li:before{content:"" counter(lst-ctn-kix_73ql7qcq5tpa-6,decimal) ". "}.lst-kix_f3p13gvgfnks-1>li{counter-increment:lst-ctn-kix_f3p13gvgfnks-1}ol.lst-kix_f3p13gvgfnks-3{list-style-type:none}ol.lst-kix_kha5qfkechm0-2.start{counter-reset:lst-ctn-kix_kha5qfkechm0-2 0}ol.lst-kix_f3p13gvgfnks-2{list-style-type:none}ol.lst-kix_f3p13gvgfnks-1{list-style-type:none}ol.lst-kix_f3p13gvgfnks-0{list-style-type:none}.lst-kix_di30h54lh28-3>li:before{content:"\0025cf "}.lst-kix_di30h54lh28-2>li:before{content:"\0025a0 "}.lst-kix_jyurzd4jvnuk-2>li{counter-increment:lst-ctn-kix_jyurzd4jvnuk-2}.lst-kix_6g1yosxwv97c-4>li:before{content:"\0025cb "}ol.lst-kix_taizt4vy16t3-1.start{counter-reset:lst-ctn-kix_taizt4vy16t3-1 0}.lst-kix_nurf0486bu14-7>li{counter-increment:lst-ctn-kix_nurf0486bu14-7}.lst-kix_6g1yosxwv97c-3>li:before{content:"\0025cf "}ol.lst-kix_nurf0486bu14-1.start{counter-reset:lst-ctn-kix_nurf0486bu14-1 0}.lst-kix_j8b5qmagvguq-2>li{counter-increment:lst-ctn-kix_j8b5qmagvguq-2}.lst-kix_vqm3flmi6t74-8>li:before{content:"" counter(lst-ctn-kix_vqm3flmi6t74-8,lower-roman) ". "}ol.lst-kix_vqm3flmi6t74-8.start{counter-reset:lst-ctn-kix_vqm3flmi6t74-8 0}.lst-kix_m38g95t6y81f-2>li{counter-increment:lst-ctn-kix_m38g95t6y81f-2}ol.lst-kix_jyurzd4jvnuk-8.start{counter-reset:lst-ctn-kix_jyurzd4jvnuk-8 0}ol.lst-kix_taizt4vy16t3-7.start{counter-reset:lst-ctn-kix_taizt4vy16t3-7 0}.lst-kix_6g1yosxwv97c-0>li:before{content:"\0025cf "}.lst-kix_8wbl4tsmsea1-8>li:before{content:"" counter(lst-ctn-kix_8wbl4tsmsea1-8,lower-roman) ". "}ol.lst-kix_jyurzd4jvnuk-7.start{counter-reset:lst-ctn-kix_jyurzd4jvnuk-7 0}ol.lst-kix_uet2thjh9w7v-6{list-style-type:none}.lst-kix_jyurzd4jvnuk-4>li{counter-increment:lst-ctn-kix_jyurzd4jvnuk-4}ol.lst-kix_uet2thjh9w7v-7{list-style-type:none}ol.lst-kix_uet2thjh9w7v-8{list-style-type:none}ol.lst-kix_uet2thjh9w7v-2{list-style-type:none}ol.lst-kix_hp102ryw7avj-3{list-style-type:none}ol.lst-kix_uet2thjh9w7v-3{list-style-type:none}ol.lst-kix_hp102ryw7avj-2{list-style-type:none}ol.lst-kix_uet2thjh9w7v-4{list-style-type:none}ol.lst-kix_hp102ryw7avj-1{list-style-type:none}ol.lst-kix_uet2thjh9w7v-5{list-style-type:none}ol.lst-kix_hp102ryw7avj-0{list-style-type:none}.lst-kix_8wbl4tsmsea1-1>li{counter-increment:lst-ctn-kix_8wbl4tsmsea1-1}ol.lst-kix_uet2thjh9w7v-0{list-style-type:none}.lst-kix_uet2thjh9w7v-3>li{counter-increment:lst-ctn-kix_uet2thjh9w7v-3}ol.lst-kix_uet2thjh9w7v-1{list-style-type:none}ol.lst-kix_f3p13gvgfnks-6.start{counter-reset:lst-ctn-kix_f3p13gvgfnks-6 0}.lst-kix_m38g95t6y81f-0>li{counter-increment:lst-ctn-kix_m38g95t6y81f-0}.lst-kix_kha5qfkechm0-8>li{counter-increment:lst-ctn-kix_kha5qfkechm0-8}ol.lst-kix_uet2thjh9w7v-6.start{counter-reset:lst-ctn-kix_uet2thjh9w7v-6 0}.lst-kix_hp102ryw7avj-2>li{counter-increment:lst-ctn-kix_hp102ryw7avj-2}.lst-kix_8wtulwd7wreh-0>li:before{content:"\0025cf "}.lst-kix_wz0jpb95pupm-6>li:before{content:"" counter(lst-ctn-kix_wz0jpb95pupm-6,decimal) ". "}.lst-kix_wz0jpb95pupm-5>li:before{content:"" counter(lst-ctn-kix_wz0jpb95pupm-5,lower-roman) ". "}ol.lst-kix_8wbl4tsmsea1-3.start{counter-reset:lst-ctn-kix_8wbl4tsmsea1-3 0}.lst-kix_8wbl4tsmsea1-8>li{counter-increment:lst-ctn-kix_8wbl4tsmsea1-8}ol.lst-kix_taizt4vy16t3-6.start{counter-reset:lst-ctn-kix_taizt4vy16t3-6 0}ol.lst-kix_f3p13gvgfnks-0.start{counter-reset:lst-ctn-kix_f3p13gvgfnks-0 0}ol.lst-kix_vqm3flmi6t74-3.start{counter-reset:lst-ctn-kix_vqm3flmi6t74-3 0}.lst-kix_wz0jpb95pupm-2>li:before{content:"" counter(lst-ctn-kix_wz0jpb95pupm-2,lower-roman) ". "}.lst-kix_nurf0486bu14-2>li{counter-increment:lst-ctn-kix_nurf0486bu14-2}.lst-kix_wz0jpb95pupm-1>li:before{content:"" counter(lst-ctn-kix_wz0jpb95pupm-1,lower-latin) ". "}.lst-kix_8wtulwd7wreh-3>li:before{content:"\0025cf "}ol.lst-kix_8wbl4tsmsea1-2.start{counter-reset:lst-ctn-kix_8wbl4tsmsea1-2 0}.lst-kix_vqm3flmi6t74-8>li{counter-increment:lst-ctn-kix_vqm3flmi6t74-8}.lst-kix_8wtulwd7wreh-4>li:before{content:"\0025cb "}ol.lst-kix_nurf0486bu14-6.start{counter-reset:lst-ctn-kix_nurf0486bu14-6 0}ol.lst-kix_hp102ryw7avj-7{list-style-type:none}ol.lst-kix_hp102ryw7avj-6{list-style-type:none}ol.lst-kix_hp102ryw7avj-5{list-style-type:none}ol.lst-kix_hp102ryw7avj-4{list-style-type:none}.lst-kix_8wtulwd7wreh-8>li:before{content:"\0025a0 "}ol.lst-kix_uet2thjh9w7v-7.start{counter-reset:lst-ctn-kix_uet2thjh9w7v-7 0}ol.lst-kix_hp102ryw7avj-8{list-style-type:none}.lst-kix_8wtulwd7wreh-7>li:before{content:"\0025cb "}ol.lst-kix_uet2thjh9w7v-8.start{counter-reset:lst-ctn-kix_uet2thjh9w7v-8 0}ul.lst-kix_6taojj4n6yll-3{list-style-type:none}.lst-kix_y42njsxzs2xp-7>li:before{content:"\0025cb "}ul.lst-kix_6taojj4n6yll-2{list-style-type:none}.lst-kix_nurf0486bu14-5>li:before{content:"" counter(lst-ctn-kix_nurf0486bu14-5,lower-roman) ". "}ul.lst-kix_6taojj4n6yll-1{list-style-type:none}ul.lst-kix_6taojj4n6yll-0{list-style-type:none}.lst-kix_kha5qfkechm0-6>li{counter-increment:lst-ctn-kix_kha5qfkechm0-6}ol.lst-kix_taizt4vy16t3-0.start{counter-reset:lst-ctn-kix_taizt4vy16t3-0 0}ul.lst-kix_6taojj4n6yll-7{list-style-type:none}ul.lst-kix_6taojj4n6yll-6{list-style-type:none}ul.lst-kix_6taojj4n6yll-5{list-style-type:none}.lst-kix_f3p13gvgfnks-8>li{counter-increment:lst-ctn-kix_f3p13gvgfnks-8}ul.lst-kix_6taojj4n6yll-4{list-style-type:none}ol.lst-kix_vqm3flmi6t74-6.start{counter-reset:lst-ctn-kix_vqm3flmi6t74-6 0}.lst-kix_y42njsxzs2xp-3>li:before{content:"\0025cf "}.lst-kix_j8b5qmagvguq-8>li:before{content:"" counter(lst-ctn-kix_j8b5qmagvguq-8,lower-roman) ". "}ol.lst-kix_nurf0486bu14-0.start{counter-reset:lst-ctn-kix_nurf0486bu14-0 0}.lst-kix_f3p13gvgfnks-7>li:before{content:"" counter(lst-ctn-kix_f3p13gvgfnks-7,lower-latin) ". "}ol.lst-kix_m38g95t6y81f-0.start{counter-reset:lst-ctn-kix_m38g95t6y81f-0 0}.lst-kix_f7i95txrvhvk-8>li:before{content:"\0025a0 "}.lst-kix_uet2thjh9w7v-1>li{counter-increment:lst-ctn-kix_uet2thjh9w7v-1}.lst-kix_f3p13gvgfnks-3>li:before{content:"" counter(lst-ctn-kix_f3p13gvgfnks-3,decimal) ". "}.lst-kix_jyurzd4jvnuk-0>li:before{content:"" counter(lst-ctn-kix_jyurzd4jvnuk-0,decimal) ". "}.lst-kix_m38g95t6y81f-7>li{counter-increment:lst-ctn-kix_m38g95t6y81f-7}ul.lst-kix_6taojj4n6yll-8{list-style-type:none}ol.lst-kix_taizt4vy16t3-3.start{counter-reset:lst-ctn-kix_taizt4vy16t3-3 0}ol.lst-kix_jyurzd4jvnuk-1.start{counter-reset:lst-ctn-kix_jyurzd4jvnuk-1 0}.lst-kix_f7i95txrvhvk-0>li:before{content:"\0025cf "}.lst-kix_kha5qfkechm0-5>li:before{content:"" counter(lst-ctn-kix_kha5qfkechm0-5,lower-roman) ". "}ol.lst-kix_f3p13gvgfnks-5.start{counter-reset:lst-ctn-kix_f3p13gvgfnks-5 0}ol.lst-kix_8wbl4tsmsea1-4.start{counter-reset:lst-ctn-kix_8wbl4tsmsea1-4 0}.lst-kix_jyurzd4jvnuk-4>li:before{content:"" counter(lst-ctn-kix_jyurzd4jvnuk-4,lower-latin) ". "}.lst-kix_jyurzd4jvnuk-8>li:before{content:"" counter(lst-ctn-kix_jyurzd4jvnuk-8,lower-roman) ". "}.lst-kix_vqm3flmi6t74-1>li{counter-increment:lst-ctn-kix_vqm3flmi6t74-1}.lst-kix_f7i95txrvhvk-4>li:before{content:"\0025cb "}ul.lst-kix_6g1yosxwv97c-8{list-style-type:none}.lst-kix_kha5qfkechm0-1>li:before{content:"" counter(lst-ctn-kix_kha5qfkechm0-1,lower-latin) ". "}ul.lst-kix_6g1yosxwv97c-7{list-style-type:none}.lst-kix_j8b5qmagvguq-0>li:before{content:"" counter(lst-ctn-kix_j8b5qmagvguq-0,decimal) ". "}ul.lst-kix_6g1yosxwv97c-6{list-style-type:none}ul.lst-kix_6g1yosxwv97c-1{list-style-type:none}.lst-kix_nurf0486bu14-4>li{counter-increment:lst-ctn-kix_nurf0486bu14-4}ul.lst-kix_6g1yosxwv97c-0{list-style-type:none}.lst-kix_j8b5qmagvguq-4>li:before{content:"" counter(lst-ctn-kix_j8b5qmagvguq-4,lower-latin) ". "}ul.lst-kix_6g1yosxwv97c-5{list-style-type:none}ul.lst-kix_6g1yosxwv97c-4{list-style-type:none}ul.lst-kix_6g1yosxwv97c-3{list-style-type:none}ul.lst-kix_6g1yosxwv97c-2{list-style-type:none}.lst-kix_wz0jpb95pupm-0>li{counter-increment:lst-ctn-kix_wz0jpb95pupm-0}ol.lst-kix_8wbl4tsmsea1-7.start{counter-reset:lst-ctn-kix_8wbl4tsmsea1-7 0}.lst-kix_nurf0486bu14-1>li:before{content:"" counter(lst-ctn-kix_nurf0486bu14-1,lower-latin) ". "}.lst-kix_uet2thjh9w7v-2>li:before{content:"" counter(lst-ctn-kix_uet2thjh9w7v-2,lower-roman) ". "}.lst-kix_uet2thjh9w7v-6>li:before{content:"" counter(lst-ctn-kix_uet2thjh9w7v-6,decimal) ". "}.lst-kix_73ql7qcq5tpa-8>li{counter-increment:lst-ctn-kix_73ql7qcq5tpa-8}.lst-kix_8wbl4tsmsea1-6>li{counter-increment:lst-ctn-kix_8wbl4tsmsea1-6}.lst-kix_vqm3flmi6t74-6>li{counter-increment:lst-ctn-kix_vqm3flmi6t74-6}.lst-kix_bav2mbt696gm-0>li:before{content:"\0025cf "}.lst-kix_73ql7qcq5tpa-1>li{counter-increment:lst-ctn-kix_73ql7qcq5tpa-1}.lst-kix_di30h54lh28-6>li:before{content:"\0025cf "}ol.lst-kix_nurf0486bu14-2.start{counter-reset:lst-ctn-kix_nurf0486bu14-2 0}ol.lst-kix_f3p13gvgfnks-2.start{counter-reset:lst-ctn-kix_f3p13gvgfnks-2 0}ol.lst-kix_jyurzd4jvnuk-4.start{counter-reset:lst-ctn-kix_jyurzd4jvnuk-4 0}.lst-kix_6g1yosxwv97c-7>li:before{content:"\0025cb "}.lst-kix_bav2mbt696gm-8>li:before{content:"\0025a0 "}.lst-kix_8vc2vf5ikyh7-1>li:before{content:"\0025cb "}ol.lst-kix_8wbl4tsmsea1-6.start{counter-reset:lst-ctn-kix_8wbl4tsmsea1-6 0}.lst-kix_bav2mbt696gm-4>li:before{content:"\0025cb "}.lst-kix_taizt4vy16t3-2>li{counter-increment:lst-ctn-kix_taizt4vy16t3-2}ol.lst-kix_vqm3flmi6t74-7.start{counter-reset:lst-ctn-kix_vqm3flmi6t74-7 0}.lst-kix_m38g95t6y81f-7>li:before{content:"" counter(lst-ctn-kix_m38g95t6y81f-7,lower-latin) ". "}ol.lst-kix_taizt4vy16t3-2.start{counter-reset:lst-ctn-kix_taizt4vy16t3-2 0}ol.lst-kix_f3p13gvgfnks-3.start{counter-reset:lst-ctn-kix_f3p13gvgfnks-3 0}.lst-kix_hp102ryw7avj-4>li{counter-increment:lst-ctn-kix_hp102ryw7avj-4}ol.lst-kix_nurf0486bu14-3.start{counter-reset:lst-ctn-kix_nurf0486bu14-3 0}.lst-kix_m38g95t6y81f-3>li:before{content:"" counter(lst-ctn-kix_m38g95t6y81f-3,decimal) ". "}ol.lst-kix_jyurzd4jvnuk-3.start{counter-reset:lst-ctn-kix_jyurzd4jvnuk-3 0}ul.lst-kix_f7i95txrvhvk-4{list-style-type:none}ul.lst-kix_f7i95txrvhvk-5{list-style-type:none}ul.lst-kix_f7i95txrvhvk-6{list-style-type:none}ul.lst-kix_f7i95txrvhvk-7{list-style-type:none}ul.lst-kix_f7i95txrvhvk-0{list-style-type:none}ol.lst-kix_f3p13gvgfnks-4.start{counter-reset:lst-ctn-kix_f3p13gvgfnks-4 0}ul.lst-kix_f7i95txrvhvk-1{list-style-type:none}ol.lst-kix_wz0jpb95pupm-6.start{counter-reset:lst-ctn-kix_wz0jpb95pupm-6 0}ul.lst-kix_f7i95txrvhvk-2{list-style-type:none}ul.lst-kix_f7i95txrvhvk-3{list-style-type:none}ul.lst-kix_f7i95txrvhvk-8{list-style-type:none}ol.lst-kix_jyurzd4jvnuk-5.start{counter-reset:lst-ctn-kix_jyurzd4jvnuk-5 0}ul.lst-kix_8wtulwd7wreh-4{list-style-type:none}ul.lst-kix_8wtulwd7wreh-3{list-style-type:none}ul.lst-kix_8wtulwd7wreh-2{list-style-type:none}ul.lst-kix_8wtulwd7wreh-1{list-style-type:none}ol.lst-kix_73ql7qcq5tpa-5.start{counter-reset:lst-ctn-kix_73ql7qcq5tpa-5 0}ul.lst-kix_8wtulwd7wreh-0{list-style-type:none}.lst-kix_wz0jpb95pupm-5>li{counter-increment:lst-ctn-kix_wz0jpb95pupm-5}.lst-kix_8vc2vf5ikyh7-3>li:before{content:"\0025cf "}ol.lst-kix_vqm3flmi6t74-5.start{counter-reset:lst-ctn-kix_vqm3flmi6t74-5 0}.lst-kix_8vc2vf5ikyh7-5>li:before{content:"\0025a0 "}ol.lst-kix_j8b5qmagvguq-8{list-style-type:none}.lst-kix_8vc2vf5ikyh7-4>li:before{content:"\0025cb "}.lst-kix_f3p13gvgfnks-4>li{counter-increment:lst-ctn-kix_f3p13gvgfnks-4}ol.lst-kix_j8b5qmagvguq-7{list-style-type:none}.lst-kix_uet2thjh9w7v-8>li{counter-increment:lst-ctn-kix_uet2thjh9w7v-8}.lst-kix_8vc2vf5ikyh7-7>li:before{content:"\0025cb "}ol.lst-kix_hp102ryw7avj-2.start{counter-reset:lst-ctn-kix_hp102ryw7avj-2 0}.lst-kix_8vc2vf5ikyh7-6>li:before{content:"\0025cf "}.lst-kix_hp102ryw7avj-8>li{counter-increment:lst-ctn-kix_hp102ryw7avj-8}.lst-kix_8wbl4tsmsea1-7>li{counter-increment:lst-ctn-kix_8wbl4tsmsea1-7}.lst-kix_8vc2vf5ikyh7-8>li:before{content:"\0025a0 "}ol.lst-kix_j8b5qmagvguq-6{list-style-type:none}ol.lst-kix_taizt4vy16t3-4.start{counter-reset:lst-ctn-kix_taizt4vy16t3-4 0}ol.lst-kix_j8b5qmagvguq-5{list-style-type:none}ol.lst-kix_j8b5qmagvguq-4{list-style-type:none}ol.lst-kix_j8b5qmagvguq-3{list-style-type:none}ol.lst-kix_j8b5qmagvguq-2{list-style-type:none}ol.lst-kix_j8b5qmagvguq-1{list-style-type:none}ol.lst-kix_wz0jpb95pupm-1.start{counter-reset:lst-ctn-kix_wz0jpb95pupm-1 0}ol.lst-kix_j8b5qmagvguq-0{list-style-type:none}ol.lst-kix_jyurzd4jvnuk-0.start{counter-reset:lst-ctn-kix_jyurzd4jvnuk-0 0}ol.lst-kix_nurf0486bu14-5.start{counter-reset:lst-ctn-kix_nurf0486bu14-5 0}ol.lst-kix_taizt4vy16t3-5{list-style-type:none}ol.lst-kix_kha5qfkechm0-6.start{counter-reset:lst-ctn-kix_kha5qfkechm0-6 0}ol.lst-kix_taizt4vy16t3-4{list-style-type:none}ol.lst-kix_taizt4vy16t3-3{list-style-type:none}.lst-kix_kha5qfkechm0-2>li{counter-increment:lst-ctn-kix_kha5qfkechm0-2}ol.lst-kix_taizt4vy16t3-2{list-style-type:none}.lst-kix_f3p13gvgfnks-0>li{counter-increment:lst-ctn-kix_f3p13gvgfnks-0}ol.lst-kix_taizt4vy16t3-8{list-style-type:none}ol.lst-kix_taizt4vy16t3-7{list-style-type:none}ol.lst-kix_taizt4vy16t3-6{list-style-type:none}.lst-kix_j8b5qmagvguq-7>li{counter-increment:lst-ctn-kix_j8b5qmagvguq-7}.lst-kix_wz0jpb95pupm-1>li{counter-increment:lst-ctn-kix_wz0jpb95pupm-1}ol.lst-kix_m38g95t6y81f-8.start{counter-reset:lst-ctn-kix_m38g95t6y81f-8 0}ol.lst-kix_taizt4vy16t3-1{list-style-type:none}ul.lst-kix_8wtulwd7wreh-8{list-style-type:none}ol.lst-kix_taizt4vy16t3-0{list-style-type:none}ul.lst-kix_8wtulwd7wreh-7{list-style-type:none}ul.lst-kix_8wtulwd7wreh-6{list-style-type:none}ul.lst-kix_8wtulwd7wreh-5{list-style-type:none}.lst-kix_nurf0486bu14-8>li{counter-increment:lst-ctn-kix_nurf0486bu14-8}ol.lst-kix_m38g95t6y81f-1.start{counter-reset:lst-ctn-kix_m38g95t6y81f-1 0}.lst-kix_jyurzd4jvnuk-7>li{counter-increment:lst-ctn-kix_jyurzd4jvnuk-7}.lst-kix_nurf0486bu14-4>li:before{content:"" counter(lst-ctn-kix_nurf0486bu14-4,lower-latin) ". "}.lst-kix_y42njsxzs2xp-6>li:before{content:"\0025cf "}.lst-kix_vqm3flmi6t74-3>li{counter-increment:lst-ctn-kix_vqm3flmi6t74-3}.lst-kix_nurf0486bu14-2>li:before{content:"" counter(lst-ctn-kix_nurf0486bu14-2,lower-roman) ". "}.lst-kix_nurf0486bu14-6>li:before{content:"" counter(lst-ctn-kix_nurf0486bu14-6,decimal) ". "}.lst-kix_y42njsxzs2xp-4>li:before{content:"\0025cb "}.lst-kix_y42njsxzs2xp-8>li:before{content:"\0025a0 "}ol.lst-kix_j8b5qmagvguq-0.start{counter-reset:lst-ctn-kix_j8b5qmagvguq-0 0}.lst-kix_8wbl4tsmsea1-4>li{counter-increment:lst-ctn-kix_8wbl4tsmsea1-4}.lst-kix_73ql7qcq5tpa-5>li{counter-increment:lst-ctn-kix_73ql7qcq5tpa-5}.lst-kix_y42njsxzs2xp-2>li:before{content:"\0025a0 "}.lst-kix_f3p13gvgfnks-8>li:before{content:"" counter(lst-ctn-kix_f3p13gvgfnks-8,lower-roman) ". "}ol.lst-kix_uet2thjh9w7v-5.start{counter-reset:lst-ctn-kix_uet2thjh9w7v-5 0}.lst-kix_73ql7qcq5tpa-4>li{counter-increment:lst-ctn-kix_73ql7qcq5tpa-4}.lst-kix_f3p13gvgfnks-2>li:before{content:"" counter(lst-ctn-kix_f3p13gvgfnks-2,lower-roman) ". "}.lst-kix_kha5qfkechm0-5>li{counter-increment:lst-ctn-kix_kha5qfkechm0-5}.lst-kix_f7i95txrvhvk-5>li:before{content:"\0025a0 "}.lst-kix_f3p13gvgfnks-6>li:before{content:"" counter(lst-ctn-kix_f3p13gvgfnks-6,decimal) ". "}.lst-kix_nurf0486bu14-8>li:before{content:"" counter(lst-ctn-kix_nurf0486bu14-8,lower-roman) ". "}ol.lst-kix_kha5qfkechm0-1.start{counter-reset:lst-ctn-kix_kha5qfkechm0-1 0}.lst-kix_kha5qfkechm0-6>li:before{content:"" counter(lst-ctn-kix_kha5qfkechm0-6,decimal) ". "}.lst-kix_f7i95txrvhvk-7>li:before{content:"\0025cb "}.lst-kix_f3p13gvgfnks-4>li:before{content:"" counter(lst-ctn-kix_f3p13gvgfnks-4,lower-latin) ". "}.lst-kix_kha5qfkechm0-4>li:before{content:"" counter(lst-ctn-kix_kha5qfkechm0-4,lower-latin) ". "}ol.lst-kix_m38g95t6y81f-3.start{counter-reset:lst-ctn-kix_m38g95t6y81f-3 0}ol.lst-kix_jyurzd4jvnuk-4{list-style-type:none}ol.lst-kix_jyurzd4jvnuk-3{list-style-type:none}.lst-kix_f7i95txrvhvk-1>li:before{content:"\0025cb "}ol.lst-kix_73ql7qcq5tpa-7.start{counter-reset:lst-ctn-kix_73ql7qcq5tpa-7 0}ol.lst-kix_jyurzd4jvnuk-2{list-style-type:none}ol.lst-kix_j8b5qmagvguq-8.start{counter-reset:lst-ctn-kix_j8b5qmagvguq-8 0}ol.lst-kix_jyurzd4jvnuk-1{list-style-type:none}.lst-kix_jyurzd4jvnuk-5>li:before{content:"" counter(lst-ctn-kix_jyurzd4jvnuk-5,lower-roman) ". "}.lst-kix_jyurzd4jvnuk-7>li:before{content:"" counter(lst-ctn-kix_jyurzd4jvnuk-7,lower-latin) ". "}ol.lst-kix_jyurzd4jvnuk-0{list-style-type:none}.lst-kix_vqm3flmi6t74-4>li{counter-increment:lst-ctn-kix_vqm3flmi6t74-4}.lst-kix_kha5qfkechm0-0>li:before{content:"" counter(lst-ctn-kix_kha5qfkechm0-0,decimal) ". "}.lst-kix_f3p13gvgfnks-0>li:before{content:"" counter(lst-ctn-kix_f3p13gvgfnks-0,decimal) ". "}.lst-kix_jyurzd4jvnuk-1>li:before{content:"" counter(lst-ctn-kix_jyurzd4jvnuk-1,lower-latin) ". "}.lst-kix_jyurzd4jvnuk-3>li:before{content:"" counter(lst-ctn-kix_jyurzd4jvnuk-3,decimal) ". "}.lst-kix_kha5qfkechm0-2>li:before{content:"" counter(lst-ctn-kix_kha5qfkechm0-2,lower-roman) ". "}ol.lst-kix_jyurzd4jvnuk-8{list-style-type:none}ol.lst-kix_8wbl4tsmsea1-1.start{counter-reset:lst-ctn-kix_8wbl4tsmsea1-1 0}ol.lst-kix_jyurzd4jvnuk-7{list-style-type:none}ol.lst-kix_jyurzd4jvnuk-6{list-style-type:none}.lst-kix_f7i95txrvhvk-3>li:before{content:"\0025cf "}ol.lst-kix_jyurzd4jvnuk-5{list-style-type:none}ol.lst-kix_m38g95t6y81f-6.start{counter-reset:lst-ctn-kix_m38g95t6y81f-6 0}ol.lst-kix_nurf0486bu14-8.start{counter-reset:lst-ctn-kix_nurf0486bu14-8 0}.lst-kix_y42njsxzs2xp-0>li:before{content:"\0025cf "}.lst-kix_nurf0486bu14-1>li{counter-increment:lst-ctn-kix_nurf0486bu14-1}.lst-kix_nurf0486bu14-0>li:before{content:"" counter(lst-ctn-kix_nurf0486bu14-0,decimal) ". "}.lst-kix_m38g95t6y81f-5>li{counter-increment:lst-ctn-kix_m38g95t6y81f-5}.lst-kix_uet2thjh9w7v-4>li{counter-increment:lst-ctn-kix_uet2thjh9w7v-4}ol.lst-kix_wz0jpb95pupm-8.start{counter-reset:lst-ctn-kix_wz0jpb95pupm-8 0}.lst-kix_taizt4vy16t3-5>li{counter-increment:lst-ctn-kix_taizt4vy16t3-5}.lst-kix_bav2mbt696gm-3>li:before{content:"\0025cf "}.lst-kix_wz0jpb95pupm-2>li{counter-increment:lst-ctn-kix_wz0jpb95pupm-2}.lst-kix_nurf0486bu14-0>li{counter-increment:lst-ctn-kix_nurf0486bu14-0}.lst-kix_m38g95t6y81f-4>li{counter-increment:lst-ctn-kix_m38g95t6y81f-4}.lst-kix_bav2mbt696gm-1>li:before{content:"\0025cb "}ol.lst-kix_uet2thjh9w7v-3.start{counter-reset:lst-ctn-kix_uet2thjh9w7v-3 0}.lst-kix_8vc2vf5ikyh7-2>li:before{content:"\0025a0 "}.lst-kix_wz0jpb95pupm-8>li{counter-increment:lst-ctn-kix_wz0jpb95pupm-8}.lst-kix_j8b5qmagvguq-0>li{counter-increment:lst-ctn-kix_j8b5qmagvguq-0}.lst-kix_bav2mbt696gm-7>li:before{content:"\0025cb "}.lst-kix_8vc2vf5ikyh7-0>li:before{content:"\0025cf "}ol.lst-kix_kha5qfkechm0-4.start{counter-reset:lst-ctn-kix_kha5qfkechm0-4 0}.lst-kix_kha5qfkechm0-8>li:before{content:"" counter(lst-ctn-kix_kha5qfkechm0-8,lower-roman) ". "}.lst-kix_j8b5qmagvguq-6>li{counter-increment:lst-ctn-kix_j8b5qmagvguq-6}.lst-kix_bav2mbt696gm-5>li:before{content:"\0025a0 "}.lst-kix_8wbl4tsmsea1-3>li{counter-increment:lst-ctn-kix_8wbl4tsmsea1-3}ol.lst-kix_vqm3flmi6t74-0.start{counter-reset:lst-ctn-kix_vqm3flmi6t74-0 0}.lst-kix_hp102ryw7avj-1>li{counter-increment:lst-ctn-kix_hp102ryw7avj-1}.lst-kix_jyurzd4jvnuk-0>li{counter-increment:lst-ctn-kix_jyurzd4jvnuk-0}.lst-kix_jyurzd4jvnuk-6>li{counter-increment:lst-ctn-kix_jyurzd4jvnuk-6}ol.lst-kix_hp102ryw7avj-0.start{counter-reset:lst-ctn-kix_hp102ryw7avj-0 0}.lst-kix_vqm3flmi6t74-3>li:before{content:"" counter(lst-ctn-kix_vqm3flmi6t74-3,decimal) ". "}.lst-kix_taizt4vy16t3-8>li:before{content:"" counter(lst-ctn-kix_taizt4vy16t3-8,lower-roman) ". "}.lst-kix_8wbl4tsmsea1-5>li:before{content:"" counter(lst-ctn-kix_8wbl4tsmsea1-5,lower-roman) ". "}ol.lst-kix_j8b5qmagvguq-7.start{counter-reset:lst-ctn-kix_j8b5qmagvguq-7 0}.lst-kix_8wbl4tsmsea1-2>li:before{content:"" counter(lst-ctn-kix_8wbl4tsmsea1-2,lower-roman) ". "}.lst-kix_8wbl4tsmsea1-6>li:before{content:"" counter(lst-ctn-kix_8wbl4tsmsea1-6,decimal) ". "}.lst-kix_vqm3flmi6t74-7>li:before{content:"" counter(lst-ctn-kix_vqm3flmi6t74-7,lower-latin) ". "}ol.lst-kix_kha5qfkechm0-8.start{counter-reset:lst-ctn-kix_kha5qfkechm0-8 0}.lst-kix_taizt4vy16t3-4>li:before{content:"" counter(lst-ctn-kix_taizt4vy16t3-4,lower-latin) ". "}.lst-kix_6taojj4n6yll-4>li:before{content:"\0025cb "}ol.lst-kix_uet2thjh9w7v-1.start{counter-reset:lst-ctn-kix_uet2thjh9w7v-1 0}.lst-kix_vqm3flmi6t74-6>li:before{content:"" counter(lst-ctn-kix_vqm3flmi6t74-6,decimal) ". "}.lst-kix_taizt4vy16t3-5>li:before{content:"" counter(lst-ctn-kix_taizt4vy16t3-5,lower-roman) ". "}.lst-kix_uet2thjh9w7v-7>li{counter-increment:lst-ctn-kix_uet2thjh9w7v-7}.lst-kix_6taojj4n6yll-3>li:before{content:"\0025cf "}.lst-kix_taizt4vy16t3-0>li:before{content:"" counter(lst-ctn-kix_taizt4vy16t3-0,decimal) ". "}.lst-kix_taizt4vy16t3-8>li{counter-increment:lst-ctn-kix_taizt4vy16t3-8}ol.lst-kix_8wbl4tsmsea1-6{list-style-type:none}ol.lst-kix_8wbl4tsmsea1-7{list-style-type:none}ol.lst-kix_8wbl4tsmsea1-8{list-style-type:none}.lst-kix_8wbl4tsmsea1-1>li:before{content:"" counter(lst-ctn-kix_8wbl4tsmsea1-1,lower-latin) ". "}ol.lst-kix_8wbl4tsmsea1-2{list-style-type:none}.lst-kix_73ql7qcq5tpa-3>li:before{content:"" counter(lst-ctn-kix_73ql7qcq5tpa-3,decimal) ". "}.lst-kix_6taojj4n6yll-0>li:before{content:"\0025cf "}ol.lst-kix_8wbl4tsmsea1-3{list-style-type:none}ol.lst-kix_8wbl4tsmsea1-4{list-style-type:none}.lst-kix_vqm3flmi6t74-2>li:before{content:"" counter(lst-ctn-kix_vqm3flmi6t74-2,lower-roman) ". "}.lst-kix_taizt4vy16t3-1>li:before{content:"" counter(lst-ctn-kix_taizt4vy16t3-1,lower-latin) ". "}ol.lst-kix_8wbl4tsmsea1-5{list-style-type:none}.lst-kix_wz0jpb95pupm-8>li:before{content:"" counter(lst-ctn-kix_wz0jpb95pupm-8,lower-roman) ". "}.lst-kix_di30h54lh28-0>li:before{content:"\0025cf "}.lst-kix_73ql7qcq5tpa-4>li:before{content:"" counter(lst-ctn-kix_73ql7qcq5tpa-4,lower-latin) ". "}.lst-kix_di30h54lh28-1>li:before{content:"\0025cb "}.lst-kix_wz0jpb95pupm-7>li:before{content:"" counter(lst-ctn-kix_wz0jpb95pupm-7,lower-latin) ". "}.lst-kix_di30h54lh28-4>li:before{content:"\0025cb "}.lst-kix_73ql7qcq5tpa-8>li:before{content:"" counter(lst-ctn-kix_73ql7qcq5tpa-8,lower-roman) ". "}.lst-kix_uet2thjh9w7v-5>li{counter-increment:lst-ctn-kix_uet2thjh9w7v-5}.lst-kix_73ql7qcq5tpa-7>li:before{content:"" counter(lst-ctn-kix_73ql7qcq5tpa-7,lower-latin) ". "}.lst-kix_hp102ryw7avj-0>li{counter-increment:lst-ctn-kix_hp102ryw7avj-0}.lst-kix_6g1yosxwv97c-1>li:before{content:"\0025cb "}.lst-kix_6g1yosxwv97c-2>li:before{content:"\0025a0 "}.lst-kix_wz0jpb95pupm-6>li{counter-increment:lst-ctn-kix_wz0jpb95pupm-6}.lst-kix_6taojj4n6yll-7>li:before{content:"\0025cb "}ol.lst-kix_hp102ryw7avj-5.start{counter-reset:lst-ctn-kix_hp102ryw7avj-5 0}.lst-kix_taizt4vy16t3-6>li{counter-increment:lst-ctn-kix_taizt4vy16t3-6}.lst-kix_6taojj4n6yll-8>li:before{content:"\0025a0 "}ol.lst-kix_j8b5qmagvguq-2.start{counter-reset:lst-ctn-kix_j8b5qmagvguq-2 0}ol.lst-kix_kha5qfkechm0-2{list-style-type:none}ol.lst-kix_kha5qfkechm0-1{list-style-type:none}ol.lst-kix_kha5qfkechm0-0{list-style-type:none}.lst-kix_8wtulwd7wreh-2>li:before{content:"\0025a0 "}ol.lst-kix_kha5qfkechm0-6{list-style-type:none}ol.lst-kix_kha5qfkechm0-5{list-style-type:none}ol.lst-kix_kha5qfkechm0-4{list-style-type:none}.lst-kix_wz0jpb95pupm-3>li:before{content:"" counter(lst-ctn-kix_wz0jpb95pupm-3,decimal) ". "}ol.lst-kix_kha5qfkechm0-3{list-style-type:none}.lst-kix_8wtulwd7wreh-1>li:before{content:"\0025cb "}ol.lst-kix_j8b5qmagvguq-6.start{counter-reset:lst-ctn-kix_j8b5qmagvguq-6 0}.lst-kix_wz0jpb95pupm-4>li:before{content:"" counter(lst-ctn-kix_wz0jpb95pupm-4,lower-latin) ". "}ol.lst-kix_kha5qfkechm0-8{list-style-type:none}.lst-kix_taizt4vy16t3-1>li{counter-increment:lst-ctn-kix_taizt4vy16t3-1}ol.lst-kix_kha5qfkechm0-7{list-style-type:none}ol.lst-kix_73ql7qcq5tpa-2.start{counter-reset:lst-ctn-kix_73ql7qcq5tpa-2 0}ul.lst-kix_bav2mbt696gm-4{list-style-type:none}ul.lst-kix_bav2mbt696gm-5{list-style-type:none}ul.lst-kix_bav2mbt696gm-6{list-style-type:none}ol.lst-kix_8wbl4tsmsea1-0{list-style-type:none}ul.lst-kix_bav2mbt696gm-7{list-style-type:none}ol.lst-kix_8wbl4tsmsea1-1{list-style-type:none}ul.lst-kix_bav2mbt696gm-8{list-style-type:none}ol.lst-kix_j8b5qmagvguq-1.start{counter-reset:lst-ctn-kix_j8b5qmagvguq-1 0}.lst-kix_nurf0486bu14-5>li{counter-increment:lst-ctn-kix_nurf0486bu14-5}.lst-kix_73ql7qcq5tpa-0>li:before{content:"" counter(lst-ctn-kix_73ql7qcq5tpa-0,decimal) ". "}ol.lst-kix_uet2thjh9w7v-0.start{counter-reset:lst-ctn-kix_uet2thjh9w7v-0 0}ul.lst-kix_bav2mbt696gm-0{list-style-type:none}ul.lst-kix_bav2mbt696gm-1{list-style-type:none}ol.lst-kix_kha5qfkechm0-7.start{counter-reset:lst-ctn-kix_kha5qfkechm0-7 0}ul.lst-kix_bav2mbt696gm-2{list-style-type:none}.lst-kix_73ql7qcq5tpa-0>li{counter-increment:lst-ctn-kix_73ql7qcq5tpa-0}ul.lst-kix_bav2mbt696gm-3{list-style-type:none}.lst-kix_wz0jpb95pupm-4>li{counter-increment:lst-ctn-kix_wz0jpb95pupm-4}.lst-kix_wz0jpb95pupm-0>li:before{content:"" counter(lst-ctn-kix_wz0jpb95pupm-0,decimal) ". "}.lst-kix_m38g95t6y81f-6>li{counter-increment:lst-ctn-kix_m38g95t6y81f-6}ol.lst-kix_73ql7qcq5tpa-3.start{counter-reset:lst-ctn-kix_73ql7qcq5tpa-3 0}.lst-kix_8wtulwd7wreh-5>li:before{content:"\0025a0 "}.lst-kix_8wtulwd7wreh-6>li:before{content:"\0025cf "}ol.lst-kix_wz0jpb95pupm-8{list-style-type:none}ol.lst-kix_73ql7qcq5tpa-1.start{counter-reset:lst-ctn-kix_73ql7qcq5tpa-1 0}.lst-kix_taizt4vy16t3-3>li{counter-increment:lst-ctn-kix_taizt4vy16t3-3}ol.lst-kix_wz0jpb95pupm-6{list-style-type:none}.lst-kix_nurf0486bu14-3>li:before{content:"" counter(lst-ctn-kix_nurf0486bu14-3,decimal) ". "}ol.lst-kix_wz0jpb95pupm-7{list-style-type:none}ol.lst-kix_wz0jpb95pupm-4{list-style-type:none}ol.lst-kix_wz0jpb95pupm-5{list-style-type:none}.lst-kix_y42njsxzs2xp-5>li:before{content:"\0025a0 "}ol.lst-kix_wz0jpb95pupm-2{list-style-type:none}ol.lst-kix_wz0jpb95pupm-3{list-style-type:none}ol.lst-kix_wz0jpb95pupm-0{list-style-type:none}.lst-kix_uet2thjh9w7v-0>li{counter-increment:lst-ctn-kix_uet2thjh9w7v-0}ol.lst-kix_wz0jpb95pupm-1{list-style-type:none}.lst-kix_m38g95t6y81f-8>li{counter-increment:lst-ctn-kix_m38g95t6y81f-8}.lst-kix_hp102ryw7avj-5>li{counter-increment:lst-ctn-kix_hp102ryw7avj-5}ol.lst-kix_wz0jpb95pupm-2.start{counter-reset:lst-ctn-kix_wz0jpb95pupm-2 0}ul.lst-kix_y42njsxzs2xp-3{list-style-type:none}ul.lst-kix_y42njsxzs2xp-2{list-style-type:none}ul.lst-kix_y42njsxzs2xp-1{list-style-type:none}ol.lst-kix_hp102ryw7avj-4.start{counter-reset:lst-ctn-kix_hp102ryw7avj-4 0}.lst-kix_f3p13gvgfnks-5>li:before{content:"" counter(lst-ctn-kix_f3p13gvgfnks-5,lower-roman) ". "}ul.lst-kix_y42njsxzs2xp-0{list-style-type:none}.lst-kix_f7i95txrvhvk-6>li:before{content:"\0025cf "}ul.lst-kix_y42njsxzs2xp-7{list-style-type:none}ul.lst-kix_y42njsxzs2xp-6{list-style-type:none}ul.lst-kix_y42njsxzs2xp-5{list-style-type:none}ul.lst-kix_y42njsxzs2xp-4{list-style-type:none}.lst-kix_kha5qfkechm0-7>li:before{content:"" counter(lst-ctn-kix_kha5qfkechm0-7,lower-latin) ". "}.lst-kix_jyurzd4jvnuk-8>li{counter-increment:lst-ctn-kix_jyurzd4jvnuk-8}.lst-kix_nurf0486bu14-7>li:before{content:"" counter(lst-ctn-kix_nurf0486bu14-7,lower-latin) ". "}.lst-kix_f3p13gvgfnks-7>li{counter-increment:lst-ctn-kix_f3p13gvgfnks-7}.lst-kix_nurf0486bu14-3>li{counter-increment:lst-ctn-kix_nurf0486bu14-3}ol.lst-kix_wz0jpb95pupm-5.start{counter-reset:lst-ctn-kix_wz0jpb95pupm-5 0}.lst-kix_kha5qfkechm0-3>li:before{content:"" counter(lst-ctn-kix_kha5qfkechm0-3,decimal) ". "}.lst-kix_hp102ryw7avj-3>li{counter-increment:lst-ctn-kix_hp102ryw7avj-3}.lst-kix_f7i95txrvhvk-2>li:before{content:"\0025a0 "}.lst-kix_uet2thjh9w7v-2>li{counter-increment:lst-ctn-kix_uet2thjh9w7v-2}.lst-kix_f3p13gvgfnks-1>li:before{content:"" counter(lst-ctn-kix_f3p13gvgfnks-1,lower-latin) ". "}ul.lst-kix_y42njsxzs2xp-8{list-style-type:none}.lst-kix_jyurzd4jvnuk-2>li:before{content:"" counter(lst-ctn-kix_jyurzd4jvnuk-2,lower-roman) ". "}.lst-kix_j8b5qmagvguq-2>li:before{content:"" counter(lst-ctn-kix_j8b5qmagvguq-2,lower-roman) ". "}.lst-kix_j8b5qmagvguq-8>li{counter-increment:lst-ctn-kix_j8b5qmagvguq-8}.lst-kix_y42njsxzs2xp-1>li:before{content:"\0025cb "}ol.lst-kix_j8b5qmagvguq-5.start{counter-reset:lst-ctn-kix_j8b5qmagvguq-5 0}.lst-kix_j8b5qmagvguq-6>li:before{content:"" counter(lst-ctn-kix_j8b5qmagvguq-6,decimal) ". "}.lst-kix_jyurzd4jvnuk-6>li:before{content:"" counter(lst-ctn-kix_jyurzd4jvnuk-6,decimal) ". "}.lst-kix_uet2thjh9w7v-4>li:before{content:"" counter(lst-ctn-kix_uet2thjh9w7v-4,lower-latin) ". "}ol.lst-kix_hp102ryw7avj-6.start{counter-reset:lst-ctn-kix_hp102ryw7avj-6 0}.lst-kix_73ql7qcq5tpa-2>li{counter-increment:lst-ctn-kix_73ql7qcq5tpa-2}.lst-kix_vqm3flmi6t74-0>li{counter-increment:lst-ctn-kix_vqm3flmi6t74-0}.lst-kix_m38g95t6y81f-1>li:before{content:"" counter(lst-ctn-kix_m38g95t6y81f-1,lower-latin) ". "}ol.lst-kix_wz0jpb95pupm-4.start{counter-reset:lst-ctn-kix_wz0jpb95pupm-4 0}.lst-kix_uet2thjh9w7v-0>li:before{content:"" counter(lst-ctn-kix_uet2thjh9w7v-0,decimal) ". "}.lst-kix_uet2thjh9w7v-8>li:before{content:"" counter(lst-ctn-kix_uet2thjh9w7v-8,lower-roman) ". "}.lst-kix_hp102ryw7avj-1>li:before{content:"" counter(lst-ctn-kix_hp102ryw7avj-1,lower-latin) ". "}.lst-kix_di30h54lh28-8>li:before{content:"\0025a0 "}.lst-kix_6g1yosxwv97c-5>li:before{content:"\0025a0 "}.lst-kix_73ql7qcq5tpa-7>li{counter-increment:lst-ctn-kix_73ql7qcq5tpa-7}.lst-kix_vqm3flmi6t74-7>li{counter-increment:lst-ctn-kix_vqm3flmi6t74-7}.lst-kix_bav2mbt696gm-2>li:before{content:"\0025a0 "}.lst-kix_m38g95t6y81f-1>li{counter-increment:lst-ctn-kix_m38g95t6y81f-1}ol.lst-kix_j8b5qmagvguq-3.start{counter-reset:lst-ctn-kix_j8b5qmagvguq-3 0}ol.lst-kix_73ql7qcq5tpa-0.start{counter-reset:lst-ctn-kix_73ql7qcq5tpa-0 0}.lst-kix_bav2mbt696gm-6>li:before{content:"\0025cf "}ol.lst-kix_hp102ryw7avj-7.start{counter-reset:lst-ctn-kix_hp102ryw7avj-7 0}.lst-kix_j8b5qmagvguq-3>li{counter-increment:lst-ctn-kix_j8b5qmagvguq-3}li.li-bullet-0:before{margin-left:-18pt;white-space:nowrap;display:inline-block;min-width:18pt}.lst-kix_kha5qfkechm0-7>li{counter-increment:lst-ctn-kix_kha5qfkechm0-7}ol.lst-kix_wz0jpb95pupm-3.start{counter-reset:lst-ctn-kix_wz0jpb95pupm-3 0}.lst-kix_8wbl4tsmsea1-0>li{counter-increment:lst-ctn-kix_8wbl4tsmsea1-0}.lst-kix_m38g95t6y81f-5>li:before{content:"" counter(lst-ctn-kix_m38g95t6y81f-5,lower-roman) ". "}.lst-kix_f3p13gvgfnks-2>li{counter-increment:lst-ctn-kix_f3p13gvgfnks-2}.lst-kix_jyurzd4jvnuk-3>li{counter-increment:lst-ctn-kix_jyurzd4jvnuk-3}ol{margin:0;padding:0}table td,table th{padding:0}.c2{margin-left:36pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c8{color:#000000;font-weight:700;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c0{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left;height:11pt}.c1{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c24{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:center}.c7{font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c6{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c21{color:#000000;font-weight:400;vertical-align:baseline;font-size:11pt;font-family:"Arial"}.c20{text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c4{background-color:#ffffff;vertical-align:sub;color:#222222}.c17{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c3{background-color:#ffffff;color:#222222;font-weight:700}.c14{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;text-decoration:underline}.c12{padding:0;margin:0}.c5{background-color:#ffffff;color:#222222}.c10{margin-left:72pt;padding-left:0pt}.c15{margin-left:144pt;padding-left:0pt}.c9{margin-left:108pt;padding-left:0pt}.c11{color:inherit;text-decoration:inherit}.c16{color:#1155cc}.c13{font-style:italic}.c23{font-style:normal}.c19{background-color:#ffffff}.c22{vertical-align:super}.c18{font-weight:700}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style>
</head>
<body class="c17 doc-content">
<p class="c24">
<span class="c8">Proxy Cost Computation in Circuit Training</span>
</p>
<p class="c0">
<span class="c8">
</span>
</p>
<p class="c6">
<span class="c5">In Circuit Training, </span>
<span class="c5 c13">p</span>
<span class="c5 c13">roxy cost</span>
<span class="c7 c5">&nbsp;is the weighted sum of wirelength, density, and congestion costs. It is used to determine the overall quality of the macro placement solution. </span>
</p>
<p class="c0">
<span class="c7 c5">
</span>
</p>
<p class="c6">
<img src="images/image1.png">
<img src="images/image2.png">
</p>
<p class="c6">
<span class="c5">Where </span>
<span class="c5">w</span>
<span class="c4">wirelength</span>
<span class="c5">, </span>
<span class="c5">w</span>
<span class="c4">density</span>
<span class="c5">&nbsp;and </span>
<span class="c5">w</span>
<span class="c4">congestion</span>
<span class="c5">&nbsp;are the weights. From the </span>
<span class="c14 c16 c19">
<a class="c11" href="https://www.google.com/url?q=https://github.com/google-research/circuit_training/blob/9e7097fa0c2a82030f43b298259941fc8ca6b7ae/circuit_training/environment/environment.py%23L61-L65&amp;sa=D&amp;source=editors&amp;ust=1663567364363272&amp;usg=AOvVaw0S9jYHB_cGUS8EoaQ63Wwq">Circuit Training repo</a>
</span>
<span class="c5">, we found that w</span>
<span class="c4">wirelength</span>
<span class="c5">=1, </span>
<span class="c5">w</span>
<span class="c4">density</span>
<span class="c5">= 1, and </span>
<span class="c5">w</span>
<span class="c4">congestion</span>
<span class="c5">= 0.5. From communication with Google engineers, we learned that in their internal flow, they use w</span>
<span class="c4">wirelength</span>
<span class="c5">=1, </span>
<span class="c5">w</span>
<span class="c4">density</span>
<span class="c5">= 0.5, and </span>
<span class="c5">w</span>
<span class="c4">congestion</span>
<span class="c7 c5">= 0.5. </span>
</p>
<p class="c0">
<span class="c7 c5">
</span>
</p>
<p class="c6">
<span class="c5">CircuitTraining repo provides the plc_wrapper_main binary to compute these cost functions. There is no available detailed description, or open-source implementation, of these cost functions. With feedback and confirmations from Google engineers, we have implemented all three cost functions; the source code is available </span>
<span class="c14 c16 c19">
<a class="c11" href="https://www.google.com/url?q=https://github.com/TILOS-AI-Institute/MacroPlacement/blob/main/CodeElements/Plc_client/plc_client_os.py&amp;sa=D&amp;source=editors&amp;ust=1663567364364175&amp;usg=AOvVaw0xArIrXjgDiC9vWiA95TI0">here</a>
</span>
<span class="c7 c5">. In the following section we provide a detailed description of the implementation of these cost functions.</span>
</p>
<p class="c0">
<span class="c7 c5">
</span>
</p>
<p class="c6">
<span class="c20 c3">Wirelength cost computation:</span>
</p>
<p class="c6">
<span class="c7 c5">The wirelength cost function depends on the net (bounding box) half-perimeter wirelength (HPWL). So, first we describe steps to compute HPWL of a net &ndash; and then we compute the wirelength cost.</span>
</p>
<p class="c0">
<span class="c7 c5">
</span>
</p>
<p class="c6">
<span class="c20 c3">Procedure to compute net HPWL: </span>
</p>
<ol class="c12 lst-kix_73ql7qcq5tpa-0 start" start="1">
<li class="c2 li-bullet-0">
<span class="c5">Initialize x</span>
<span class="c4">min</span>
<span class="c5">&nbsp;= float_max, y</span>
<span class="c4">min</span>
<span class="c5">&nbsp;= float_max and x</span>
<span class="c4">max</span>
<span class="c5">&nbsp;= 0, y</span>
<span class="c4">max</span>
<span class="c7 c5">&nbsp;= 0.</span>
</li>
<li class="c2 li-bullet-0">
<span class="c7 c5">For each node in net:</span>
</li>
</ol>
<ol class="c12 lst-kix_73ql7qcq5tpa-1 start" start="1">
<li class="c6 c10 li-bullet-0">
<span class="c5">x</span>
<span class="c4">min</span>
<span class="c5">&nbsp;= min(x</span>
<span class="c4">min</span>
<span class="c5">, node-&gt;x), y</span>
<span class="c4">min</span>
<span class="c5">&nbsp;= min(y</span>
<span class="c4">min</span>
<span class="c5 c7">, node-&gt;y)</span>
</li>
<li class="c6 c10 li-bullet-0">
<span class="c5">x</span>
<span class="c4">max</span>
<span class="c5">&nbsp;= max(x</span>
<span class="c4">max</span>
<span class="c5">, node-&gt;x), y</span>
<span class="c4">max</span>
<span class="c5">&nbsp;= max(y</span>
<span class="c4">max</span>
<span class="c7 c5">, node-&gt;y)</span>
</li>
</ol>
<ol class="c12 lst-kix_73ql7qcq5tpa-0" start="3">
<li class="c2 li-bullet-0">
<span class="c5">net_hpwl = &nbsp;(x</span>
<span class="c4">max</span>
<span class="c5">&nbsp;- x</span>
<span class="c4">min</span>
<span class="c5">) + (y</span>
<span class="c4">max</span>
<span class="c5">&nbsp;- y</span>
<span class="c4">min</span>
<span class="c7 c5">)</span>
</li>
</ol>
<p class="c0">
<span class="c7 c5">
</span>
</p>
<p class="c6">
<span class="c5">A protobuf netlist consists of different types of nodes. Different possible types of nodes are macro, standard cell, macro pin and port. A net consists of one source node and one or more sink nodes. A net can have only standard cell, macro pin and port as its source or sink nodes. In the following wirelength cost computation procedure, we use the term </span>
<span class="c5 c13">net weight</span>
<span class="c5">,</span>
<span class="c5">&nbsp;which is the weight of the </span>
<span class="c14 c5">source node</span>
<span class="c7 c5">&nbsp;of the net. This weight indicates the total number of connections between the source and each sink node. </span>
</p>
<p class="c0">
<span class="c7 c5">
</span>
</p>
<p class="c6">
<span class="c3 c20">Procedure to compute wirelength cost:</span>
</p>
<ol class="c12 lst-kix_taizt4vy16t3-0 start" start="1">
<li class="c2 li-bullet-0">
<span class="c7 c5">hpwl = 0, net_count = 0</span>
</li>
<li class="c2 li-bullet-0">
<span class="c7 c5">For each net:</span>
</li>
</ol>
<ol class="c12 lst-kix_taizt4vy16t3-1 start" start="1">
<li class="c6 c10 li-bullet-0">
<span class="c7 c5">hpwl += net-&gt;weight * net_hpwl</span>
</li>
<li class="c6 c10 li-bullet-0">
<span class="c7 c5">net_count += net-&gt;weight.</span>
</li>
</ol>
<ol class="c12 lst-kix_taizt4vy16t3-0" start="3">
<li class="c2 li-bullet-0">
<span class="c7 c5">wirelength cost = hpwl/(net_count * (canvas_height + canvas_width))</span>
</li>
</ol>
<p class="c0">
<span class="c7 c5">
</span>
</p>
<p class="c6">
<span class="c7 c5">In the above procedure, canvas_height is the height of the canvas and canvas_width is the width of the canvas.</span>
</p>
<p class="c0">
<span class="c7 c5">
</span>
</p>
<p class="c6">
<span class="c3">Density cost computation:</span>
</p>
<p class="c6">
<span class="c1">Density cost function depends on the gridcell density. So, first we describe the steps to compute gridcell density &ndash; and then we compute the density cost.</span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span class="c1">The gridcell density of grid (i, j) is the ratio of the summation of all the overlapped areas (the common area between the node and the grid) of standard cell and macro nodes with the grid (i, j) to the total gridcell area.</span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span class="c8">Procedure to compute density cost:</span>
</p>
<ol class="c12 lst-kix_j8b5qmagvguq-0 start" start="1">
<li class="c2 li-bullet-0">
<span class="c1">n =number of rows * number of columns.</span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">k = floor(n*0.1)</span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">If k == 0</span>
</li>
</ol>
<ol class="c12 lst-kix_j8b5qmagvguq-1 start" start="1">
<li class="c6 c10 li-bullet-0">
<span class="c1">k = 1</span>
</li>
</ol>
<ol class="c12 lst-kix_j8b5qmagvguq-0" start="4">
<li class="c2 li-bullet-0">
<span class="c1">Density cost = (average density of top k densest gridcells) * 0.5.</span>
</li>
</ol>
<p class="c0">
<span class="c8">
</span>
</p>
<p class="c6">
<span>Notice that 0.5 is not the &ldquo;weight&rdquo; of this cost function, but simply another factor applied besides the weight factor from the cost function. Google engineers informed us &ldquo; the 0.5 is there to correct the </span>
<span class="c14 c16">
<a class="c11" href="https://www.google.com/url?q=https://github.com/google-research/circuit_training/blob/9e7097fa0c2a82030f43b298259941fc8ca6b7ae/circuit_training/grouping/grouping.py%23L370&amp;sa=D&amp;source=editors&amp;ust=1663567364367750&amp;usg=AOvVaw2-k4jjfubAAwD7CZGZeyft">bloating of the std cell clusters</a>
</span>
<span class="c1">&rdquo;.</span>
</p>
<p class="c0">
<span class="c8">
</span>
</p>
<a id="kix.ke5yvwxwz23v">
</a>
<p class="c6">
<span class="c18">Congestion cost </span>
<span class="c18">computation</span>
<span class="c8">:</span>
</p>
<p class="c6">
<span class="c1">We divide the congestion cost computation into six sub-stages:</span>
</p>
<ol class="c12 lst-kix_uet2thjh9w7v-0 start" start="1">
<li class="c2 li-bullet-0">
<span class="c14 c16">
<a class="c11" href="#kix.vz68r6b84tl6">Compute horizontal and vertical congestion of each grid due to net routing.</a>
</span>
</li>
<li class="c2 li-bullet-0">
<span class="c14 c16">
<a class="c11" href="#kix.2vjgmooqq2ri">Apply smoothing only to grid congestion due to net routing.</a>
</span>
</li>
<li class="c2 li-bullet-0">
<span class="c14 c16">
<a class="c11" href="#kix.cmfsmmjct5gp">Compute congestion of each grid due to macros. When a module overlaps with multiple gridcells, if any part of the module partially overlaps with the gridcell (either vertically, or horizontally), we set the top row (if vertical) or right column (if horizontal) to 0. </a>
</span>
</li>
<li class="c2 li-bullet-0">
<span class="c18">Grid horizontal congestion</span>
<span class="c1">&nbsp;= horizontal congestion due to macros + horizontal congestion due to net routing after smoothing. </span>
</li>
<li class="c2 li-bullet-0">
<span class="c18">Grid vertical congestion</span>
<span class="c1">&nbsp;= vertical congestion due to macros + vertical congestion due to net routing after smoothing.</span>
</li>
<li class="c2 li-bullet-0">
<span class="c14 c16">
<a class="c11" href="#id.mv122dawrylu">Finally, we concatenate the </a>
</span>
<span class="c14 c16 c18">
<a class="c11" href="#id.mv122dawrylu">Grid horizontal congestion</a>
</span>
<span class="c14 c16">
<a class="c11" href="#id.mv122dawrylu">&nbsp;array and the </a>
</span>
<span class="c14 c16 c18">
<a class="c11" href="#id.mv122dawrylu">Grid vertical congestion</a>
</span>
<span class="c14 c16">
<a class="c11" href="#id.mv122dawrylu">&nbsp;array</a>
</span>
<span class="c14 c16 c18">
<a class="c11" href="#id.mv122dawrylu">&nbsp;</a>
</span>
<span class="c14 c16">
<a class="c11" href="#id.mv122dawrylu">and take the average of the top </a>
</span>
<span class="c14 c16 c18">
<a class="c11" href="#id.mv122dawrylu">5%</a>
</span>
<span class="c14 c16">
<a class="c11" href="#id.mv122dawrylu">&nbsp;of the concatenated list.</a>
</span>
</li>
</ol>
<p class="c0">
<span class="c1">
</span>
</p>
<a id="kix.vz68r6b84tl6">
</a>
<p class="c6">
<span class="c21 c14 c23">Computation of grid congestion due to net routing:</span>
</p>
<p class="c6">
<span class="c1">We divide this problem into three sub-problems:</span>
</p>
<ol class="c12 lst-kix_vqm3flmi6t74-0 start" start="1">
<li class="c2 li-bullet-0">
<span class="c1">Congestion due to two-pin nets.</span>
</li>
<li class="c2 li-bullet-0">
<span>Congestion due to three-pin nets.</span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">Congestion due to multi-pin nets where the number of pins is greater than three.</span>
</li>
</ol>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span>A grid location (i, j) is the intersection of the i</span>
<span class="c22">th</span>
<span>&nbsp;column with the j</span>
<span class="c22">th</span>
<span class="c1">&nbsp;row.</span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span class="c1">For these three problems we consider that the horizontal routing cost due to a net-segment from (i, j) grid to (i+1, j) grid applies only to the grid (i, j). Similarly the vertical routing cost due to a net-segment from (i,j) grid to (i, j+1) grid applies only to the grid (i,j). Here the direction of the net does not matter. </span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span class="c1">Now we compute the congestion due to different nets:</span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span class="c21 c14 c13">Congestion due to two-pin nets:</span>
</p>
<p class="c6">
<span class="c1">Two-pin net routing depends on the source and sink node. Consider </span>
</p>
<ol class="c12 lst-kix_kha5qfkechm0-0 start" start="1">
<li class="c2 li-bullet-0">
<span class="c1">Source node is (i1, j1)</span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">Sink node is (i2, j2)</span>
</li>
</ol>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span class="c8">Procedure for congestion computation due to two-pin nets:</span>
</p>
<ol class="c12 lst-kix_wz0jpb95pupm-0 start" start="1">
<li class="c2 li-bullet-0">
<span class="c1">imin = min(i1, i2), imax = max(i1, i2)</span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">w = net weight</span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">Add horizontal congestion cost (considering weight w) due this net to grids from (imin, j1) to (imax-1, j1).</span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">jmin = min(j1, j2), jmax = max(j1, j2)</span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">Add vertical congestion cost (considering weight w) due to this net to grids from (i2, jmin) to (i2, jmax - 1).</span>
</li>
</ol>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span>In the following figure P2 is the source pin and P1 is </span>
<span>the </span>
<span class="c1">sink pin of the net. When the arrow crosses the top edge of the grid cell it contributes to the vertical congestion cost of the grid cell and when it crosses the right edge of the grid cell it contributes to the horizontal congestion cost of the grid cell.</span>
</p>
<p class="c6">
<span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 534.81px; height: 257.98px;">
<img alt="" src="images/image14.png" style="width: 534.81px; height: 257.98px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title="">
</span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span class="c14 c13 c21">Congestion due to three-pin nets:</span>
</p>
<p class="c6">
<span class="c1">Congestion cost of three-pin nets does not change when the locations of the pins are interchanged.</span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span class="c1">In the following figure, P3 is the source and P1 and P2 are the sinks. We see that interchanging the position does not change the route.</span>
</p>
<p class="c6">
<span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 526.50px; height: 254.38px;">
<img alt="" src="images/image13.png" style="width: 526.50px; height: 254.38px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title="">
</span>
</p>
<p class="c6">
<span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 523.50px; height: 254.20px;">
<img alt="" src="images/image10.png" style="width: 523.50px; height: 254.20px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title="">
</span>
</p>
<p class="c6">
<span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 518.50px; height: 251.77px;">
<img alt="" src="images/image7.png" style="width: 518.50px; height: 251.77px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title="">
</span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span class="c1">Consider the three pin locations are (i1, j1), (i2, j2) and (i3, j3).</span>
</p>
<p class="c6">
<span class="c1">We compute congestion due to three-pins using two functions:</span>
</p>
<ol class="c12 lst-kix_8wbl4tsmsea1-0 start" start="1">
<li class="c2 li-bullet-0">
<span class="c1">L_routing</span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">T_routing </span>
</li>
</ol>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span class="c1">In the below function all congestion cost computation takes into account the weight.</span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span class="c1">First we describe these two functions and then we describe how the congestion due to three pin nets are computed.</span>
</p>
<p class="c6">
<span class="c8">Congestion cost update using L_routing:</span>
</p>
<p class="c6">
<span class="c1">The inputs are three pin grid id and net weight. We consider pin grids are &nbsp;(i1, j1), (i2, j2) and (i3, j3) where i1 &lt; i2 &lt; i3 and (j1 &lt; j2 &lt; j3) or (j1 &gt; j2 &gt; j3).</span>
</p>
<ol class="c12 lst-kix_hp102ryw7avj-0 start" start="1">
<li class="c2 li-bullet-0">
<span class="c1">Add horizontal congestion cost due to the net to grids from (i1, j1) to (i2-1, j1)</span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">Add horizontal congestion cost due to the net to grids from (i2, j2) to (i3-1, j2)</span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">Add vertical congestion cost due to the net to grids from (i2, min(j1, j2)) to (i2, max(j1, j2) - 1).</span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">Add vertical congestion cost due to the net to grids from (i3, min(j2, j3)) to (i3, max(j2, j3) - 1).</span>
</li>
</ol>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span class="c18">Congestion cost update using T_routing</span>
<span class="c1">:</span>
</p>
<p class="c6">
<span class="c1">The inputs are three pin grid id and net weight. We consider pin grids as (i1, j1), (i2, j2) and (i3, j3) where (j1 &lt;= j2 &lt;= j3 ) or (j1 &gt;= j2 &gt;= j3).</span>
</p>
<ol class="c12 lst-kix_m38g95t6y81f-0 start" start="1">
<li class="c2 li-bullet-0">
<span class="c1">imin = min(i1, i2, i3), imax = max(i1, i2, i3)</span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">Add horizontal congestion cost due to the net to grids from (imin, j2) to (imax - 1, j2).</span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">Add vertical congestion cost due to the net to the grid from (i1, min(j1, j2)) to (i1, max(j1, j2) - 1).</span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">Add vertical congestion cost due to the net to the grid from (i3, min(j2, j3)) to (i3, max(j2, j3) - 1).</span>
</li>
</ol>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span class="c8">Procedure congestion cost computation due to three-pin nets:</span>
</p>
<p class="c6">
<span class="c1">The inputs are three pin grid locations and the net weight.</span>
</p>
<ol class="c12 lst-kix_nurf0486bu14-0 start" start="1">
<li class="c2 li-bullet-0">
<span class="c1">Sort the pin based on the column. After sorting pin locations are (i1, j1), (i2, j2) and (i3, j3). As it is sorted based on column i1 &lt;= i2 &lt;= i3.</span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">&nbsp;If i1 &lt; i2 and i2 &lt; i3 and min(j1, j3) &lt; j2 and max(j1, j3) &gt; j2:</span>
</li>
</ol>
<ol class="c12 lst-kix_nurf0486bu14-1 start" start="1">
<li class="c6 c10 li-bullet-0">
<span class="c1">Update congestion cost using L_routing.</span>
</li>
<li class="c6 c10 li-bullet-0">
<span class="c1">Return.</span>
</li>
</ol>
<ol class="c12 lst-kix_nurf0486bu14-0" start="3">
<li class="c2 li-bullet-0">
<span class="c1">If i2 == i3 and i1 &lt; i2 and j1 &lt; min(j2, j3):</span>
</li>
</ol>
<ol class="c12 lst-kix_nurf0486bu14-1 start" start="1">
<li class="c6 c10 li-bullet-0">
<span class="c1">Add horizontal congestion cost due to the net to grids from (i1, j1) to (i2-1, j1)</span>
</li>
<li class="c6 c10 li-bullet-0">
<span class="c1">Add vertical congestion cost due to the net to grids from (i2, j1) to (i2, max(j2, j3) -1)</span>
</li>
<li class="c6 c10 li-bullet-0">
<span class="c1">Return.</span>
</li>
</ol>
<ol class="c12 lst-kix_nurf0486bu14-0" start="4">
<li class="c2 li-bullet-0">
<span class="c1">If j2 == j3:</span>
</li>
</ol>
<ol class="c12 lst-kix_nurf0486bu14-1 start" start="1">
<li class="c6 c10 li-bullet-0">
<span class="c1">Add horizontal congestion cost due to the net to grids from (i1, j1) to (i2 -1, j1)</span>
</li>
<li class="c6 c10 li-bullet-0">
<span class="c1">Add horizontal congestion cost due to the net to grids from (i2, j2) to (i3 -1, j2)</span>
</li>
<li class="c6 c10 li-bullet-0">
<span class="c1">Add vertical congestion cost due to the net to grids from (i2, min(j2, j3)) to (i2, max(j2, j3) - 1).</span>
</li>
<li class="c6 c10 li-bullet-0">
<span class="c1">Return</span>
</li>
</ol>
<ol class="c12 lst-kix_nurf0486bu14-0" start="5">
<li class="c2 li-bullet-0">
<span class="c1">Update congestion cost using T_routing.</span>
</li>
</ol>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span class="c1">The following four figures represent the four cases mentioned in the above procedure from point two to point five.</span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span class="c1">&nbsp; &nbsp;Figure corresponding to point two. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Figure corresponding to point three.</span>
</p>
<p class="c6">
<span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 279.46px; height: 273.60px;">
<img alt="" src="images/image9.png" style="width: 279.46px; height: 273.60px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title="">
</span>
<span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 278.96px; height: 273.36px;">
<img alt="" src="images/image5.png" style="width: 278.96px; height: 273.36px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title="">
</span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span class="c1">&nbsp; &nbsp;Figure corresponding to point three. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Figure corresponding to point five.</span>
</p>
<p class="c6">
<span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 279.46px; height: 273.60px;">
<img alt="" src="images/image4.png" style="width: 279.46px; height: 273.60px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title="">
</span>
<span>&nbsp;</span>
<span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 273.60px; height: 273.60px;">
<img alt="" src="images/image11.png" style="width: 273.60px; height: 273.60px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title="">
</span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span class="c13 c14">Congestion due to multi-pin nets where the number of pins is greater than three:</span>
</p>
<ol class="c12 lst-kix_f3p13gvgfnks-0 start" start="1">
<li class="c2 li-bullet-0">
<span class="c1">Consider the net is a n-pin net where n &gt; 3. </span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">We break this net into n-1 two pin nets where the source node is the common node.</span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">For each two pin nets we update congestion values.</span>
</li>
</ol>
<p class="c0">
<span class="c1">
</span>
</p>
<a id="kix.2vjgmooqq2ri">
</a>
<p class="c6">
<span class="c21 c14 c23">Computation for Smoothing:</span>
</p>
<ul class="c12 lst-kix_di30h54lh28-0 start">
<li class="c2 li-bullet-0">
<span class="c8">Congestion smoothing = 0.0</span>
</li>
</ul>
<ul class="c12 lst-kix_di30h54lh28-1 start">
<li class="c6 c10 li-bullet-0">
<span class="c1">Return the grid congestion that is due to net routing: no smoothing is applied.</span>
</li>
</ul>
<ul class="c12 lst-kix_di30h54lh28-0">
<li class="c2 li-bullet-0">
<span class="c18">Congestion smoothing &gt; 0.0 = k</span>
<span>&nbsp;(k is an integer; both CT and our code appear to use the floor of any non-integer </span>
<span class="c13">smoothing </span>
<span class="c1">value)</span>
</li>
</ul>
<ul class="c12 lst-kix_di30h54lh28-1 start">
<li class="c6 c10 li-bullet-0">
<span class="c1">Take grid congestion due to net routing</span>
</li>
<li class="c6 c10 li-bullet-0">
<span class="c1">For horizontal grid congestion</span>
</li>
</ul>
<ul class="c12 lst-kix_di30h54lh28-2 start">
<li class="c6 c9 li-bullet-0">
<span class="c1">For each gridcell</span>
</li>
</ul>
<ul class="c12 lst-kix_di30h54lh28-3 start">
<li class="c6 c15 li-bullet-0">
<span class="c1">If not out-of-bound, take k gridcells on each side (left/right), divide the current cell entry by the total number of gridcells taken and add the value to the corresponding gridcell.</span>
</li>
</ul>
<ul class="c12 lst-kix_di30h54lh28-1">
<li class="c6 c10 li-bullet-0">
<span class="c1">For vertical grid congestion</span>
</li>
</ul>
<ul class="c12 lst-kix_di30h54lh28-2 start">
<li class="c6 c9 li-bullet-0">
<span class="c1">For each gridcell</span>
</li>
</ul>
<ul class="c12 lst-kix_di30h54lh28-3 start">
<li class="c6 c15 li-bullet-0">
<span class="c1">If not out-of-bound, take k gridcells on each side (up/down), divide the current cell entry by the total number of gridcells taken and add the value to the corresponding gridcell.</span>
</li>
</ul>
<ul class="c12 lst-kix_di30h54lh28-1">
<li class="c6 c10 li-bullet-0">
<span>For example, suppose that </span>
<span class="c13">smoothing </span>
<span class="c1">= 2 (default value), and we apply it to horizontal grid congestion in four rows of gridcells with respect to the red gridcell highlighted in each row. Then, the blue gridcells in each row show the numbers of gridcells that we divide by (respectively from the top row to the bottom row: &nbsp;3, 4, 5, 4) when smoothing congestion.</span>
</li>
</ul>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c6">
<span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 288.00px; height: 234.72px;">
<img alt="" src="images/image3.png" style="width: 288.00px; height: 234.72px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title="">
</span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
<a id="kix.cmfsmmjct5gp">
</a>
<p class="c6">
<span class="c21 c14 c23">Computation for Macro Congestion:</span>
</p>
<ul class="c12 lst-kix_8wtulwd7wreh-0 start">
<li class="c2 li-bullet-0">
<span class="c1">For each soft macro + hard MACRO:</span>
</li>
</ul>
<ul class="c12 lst-kix_8wtulwd7wreh-1 start">
<li class="c6 c10 li-bullet-0">
<span class="c1">For each gridcell it overlaps with:</span>
</li>
</ul>
<ul class="c12 lst-kix_8wtulwd7wreh-2 start">
<li class="c6 c9 li-bullet-0">
<span class="c1">For both horizontal and vertical macro routing congestion map:</span>
</li>
</ul>
<ul class="c12 lst-kix_8wtulwd7wreh-3 start">
<li class="c6 c15 li-bullet-0">
<span class="c1">Find the dimension of overlap, multiply by macro routing allocation</span>
</li>
<li class="c6 c15 li-bullet-0">
<span class="c1">Divide by (the grid_cell dimension multiplied by routing per micron)</span>
</li>
<li class="c6 c15 li-bullet-0">
<span class="c1">Add to the corresponding gridcell</span>
</li>
</ul>
<ul class="c12 lst-kix_8wtulwd7wreh-0">
<li class="c2 li-bullet-0">
<span class="c1">Example:</span>
</li>
</ul>
<ul class="c12 lst-kix_8wtulwd7wreh-1 start">
<li class="c6 c10 li-bullet-0">
<span>Given a </span>
<span>single hard macro HM_1</span>
<span class="c1">&nbsp;(pink rectangle in the figure below), we have two pins instantiated on the top-right and bottom-left, driven by the ports at &ldquo;P_1&rdquo; located at the bottom-left of the canvas.</span>
</li>
<li class="c6 c10 li-bullet-0">
<span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 288.00px; height: 300.48px;">
<img alt="" src="images/image8.png" style="width: 288.00px; height: 300.48px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title="">
</span>
</li>
<li class="c6 c10 li-bullet-0">
<span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 288.00px; height: 331.20px;">
<img alt="" src="images/image6.png" style="width: 288.00px; height: 331.20px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title="">
</span>
</li>
<li class="c6 c10 li-bullet-0">
<span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 288.00px; height: 300.48px;">
<img alt="" src="images/image12.png" style="width: 288.00px; height: 300.48px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title="">
</span>
</li>
<li class="c6 c10 li-bullet-0">
<span class="c1">Whenever there are gridcells partially overlapped, whether in horizontal or vertical direction, we set the vertical congestion of the top gridcells to 0 (if partially overlapped vertically) and we set the horizontal congestion of the right gridcells to 0 (if partially overlapped horizontally).</span>
</li>
</ul>
<p class="c0">
<span class="c1">
</span>
</p>
<a id="id.mv122dawrylu">
</a>
<p class="c6">
<span class="c21 c14 c23">Computation of the final congestion cost:</span>
</p>
<ul class="c12 lst-kix_y42njsxzs2xp-0 start">
<li class="c2 li-bullet-0">
<span class="c1">Adding the Macro allocation congestion and Net routing congestion together for both Vertical and Horizontal congestion map</span>
</li>
<li class="c2 li-bullet-0">
<span class="c1">Concat both vertical and horizontal congestion maps together.</span>
</li>
<li class="c2 li-bullet-0">
<span>Take the top </span>
<span class="c18">5%</span>
<span>&nbsp;of the most congested gridcells </span>
<span class="c18">in the concatenation</span>
<span class="c1">, and average them out to get the final congestion cost. &nbsp;</span>
</li>
</ul>
<p class="c0">
<span class="c1">
</span>
</p>
<p class="c0">
<span class="c1">
</span>
</p>
</body>
</html>
# Proxy Cost Computation in Circuit Training
In Circuit Training, *proxy cost* is the weighted sum of wirelength, density, and congestion costs. It is used to determine the overall quality of the macro placement solution.
$$
Proxy Cost = W_{wirelength} \times Cost_{wirelength} + W_{density} \times Cost_{density} + W_{congestion} \times Cost_{congestion}
$$
Where $W_{wirelength}$, $W_{density}$ and $W_{congestion}$ are the weights. From the [Circuit Training repo](https://github.com/google-research/circuit_training/blob/9e7097fa0c2a82030f43b298259941fc8ca6b7ae/circuit_training/environment/environment.py#L61-L65), we found that $W_{wirelength} = 1$, $W_{density} = 1$, and $W_{congestion} = 0.5$. From communication with Google engineers, we learned that in their internal flow, they use $W_{wirelength} = 1$, $W_{density} = 0.5$, and $W_{congestion} = 0.5$.
CircuitTraining repo provides the plc_wrapper_main binary to compute these cost functions. There is no available detailed description, or open-source implementation, of these cost functions. With feedback and confirmations from Google engineers, we have implemented all three cost functions; the source code is available [here](../../CodeElements/Plc_client/plc_client_os.py). In the following section we provide a detailed description of the implementation of these cost functions.
## Table of Content
- [Wirelength cost computation:](#wirelength-cost-computation)
- [Density cost computation:](#density-cost-computation)
- [Congestion cost computation:](#congestion-cost-computation)
## Wirelength cost computation
The wirelength cost function depends on the net (bounding box) half-perimeter wirelength (HPWL). So, first we describe steps to compute HPWL of a net – and then we compute the wirelength cost.
##### **Procedure to compute net HPWL**
1. Initialize $x_{min} = float_{max}$, $y_{min} = float_{max}$, $x_{max} = 0$, $y_{max} = 0$
2. For each $node$ in net
1. $x_{min} = min(x_{min}, node \rarr x)$, $y_{min} = min(y_{min}, node \rarr y)$
2. $x_{max} = max(x_{max}, node \rarr x)$, $y_{max} = max(y_{max}, node \rarr y)$
3. net_hpwl = $(x_{max} - x_{min}) + (x_{max} + x_{min})$
A protobuf netlist consists of different types of $node$s. Different possible types of $node$s are macro, standard cell, macro pin and port. A net consists of one source $node$ and one or more sink $node$s. A net can have only standard cell, macro pin and port as its source or sink $node$s. In the following wirelength cost computation procedure, we use the term net weight, which is the weight of the source $node$ of the net. This weight indicates the total number of connections between the source and each sink $node$.
##### **Procedure to compute wirelength cost**
1. $hpwl = 0$, $net_{count} = 0$
2. For each $net$
1. Compute $net_{hpwl}$ using the previous procedure
2. $hpwl += net \rarr weight \times net_{hpwl}$
3. $net_{count} += net \rarr weight$
3. $Cost_{wirelength} = \frac{hpwl}{net_{count} \times (canvas_{height} + canvas_{width})}$
In the above procedure, $canvas_{height}$ is the height of the canvas and $canvas_{width}$ is the width of the canvas.
## Density cost computation
Density cost function depends on the gridcell density. So, first we describe the steps to compute gridcell density – and then we compute the density cost.
The gridcell density of grid (i, j) is the ratio of the summation of all the overlapped areas (the common area between the node and the grid) of standard cell and macro nodes with the grid (i, j) to the total gridcell area.
##### **Procedure to compute density cost**
1. $n =$ number of rows $\times$ number of columns
2. $k = floor(n \times 0.1)$
3. if $k == 0$
1. $k = 1$
4. $Cost_{density} =$ (average density of top $k$ densest gridcells) $\times 0.5$
Notice that 0.5 is not the “weight” of this cost function, but simply another factor applied besides the weight factor from the cost function. Google engineers informed us “ the 0.5 is there to correct the [bloating of the std cell clusters](https://github.com/google-research/circuit_training/blob/9e7097fa0c2a82030f43b298259941fc8ca6b7ae/circuit_training/grouping/grouping.py#L370)”.
## Congestion cost computation
We divide the congestion cost computation into six sub-stages:
1. [Compute horizontal and vertical congestion of each grid due to net routing.](#computation-of-grid-congestion-due-to-net-routing)
2. Apply smoothing only to grid congestion due to net routing.
3. Compute congestion of each grid due to macros. When a module overlaps with multiple gridcells, if any part of the module partially overlaps with the gridcell (either vertically, or horizontally), we set the top row (if vertical) or right column (if horizontal) to 0.
4. **Grid horizontal congestion** = horizontal congestion due to macros + horizontal congestion due to net routing after smoothing.
5. **Grid vertical congestion** = vertical congestion due to macros + vertical congestion due to net routing after smoothing.
6. Finally, we concatenate the **Grid horizontal congestion** array and the **Grid vertical congestion** array and take the average of the top **5**% of the concatenated list.
### Computation of grid congestion due to net routing
We divide this problem into three sub-problems.
1. Congestion due to two-pin nets.
2. Congestion due to three-pin nets.
3. Congestion due to multi-pin nets where the number of pins is greater than three.
A grid location $(i, j)$ is the intersection of the $i^{th}$ column with the $j^{th}$ row.
For these three problems we consider that the horizontal routing cost due to a net-segment from $(i, j)$ grid to $(i+1, j)$ grid applies only to the grid $(i, j)$. Similarly the vertical routing cost due to a net-segment from $(i, j)$ grid to $(i, j+1)$ grid applies only to the grid $(i, j)$. Here the direction of the net does not matter.
Now we compute the congestion due to different nets:
#### *Congestion due to two-pin nets*
Two-pin net routing depends on the source and sink node. Consider
1. Source node is $(i_1, j_1)$
2. Sink node is $(i_2, j_2)$
##### **Procedure for congestion computation due to two-pin nets**
1. $i_{min} = min(i_1, i_2)$, $i_{max} = max(i_1, i_2)$
2. $w =$ net weight
3. Add horizontal congestion cost (considering weight $w$) due this net to grids from $(i_{min}, j_1)$ to $(i_{max}-1, j_1)$.
4. $j_{min} = min(j_1, j_2)$, $j_{max} = max(j_1, j_2)$
5. Add vertical congestion cost (considering weight $w$) due to this net to grids from $(i_2, j_{min})$ to $(i_2, j_{max} - 1)$.
In the following figure P2 is the source pin and P1 is the sink pin of the net. When the arrow crosses the top edge of the grid cell it contributes to the vertical congestion cost of the grid cell and when it crosses the right edge of the grid cell it contributes to the horizontal congestion cost of the grid cell.
<p align="center">
<img width="600" src="./images/image14.png" alg="TwoPin1">
</p>
#### *Congestion due to three-pin nets*
The Congestion cost of three-pin nets does not change when the locations of the pins are interchanged.
In the following figure, P3 is the source and P1 and P2 are the sinks. We see that interchanging the position does not change the route.
<p align="center">
<img width="600" src="./images/image13.png" alg="ThreePin1">
</p>
<p align="center">
<img width="600" src="./images/image10.png" alg="ThreePin2">
</p>
<p align="center">
<img width="600" src="./images/image7.png" alg="ThreePin3">
</p>
Consider the three pin locations are $(i_1, j_1)$, $(i_2, j_2)$ and $(i_3, j_3)$.
We compute congestion due to three-pins using two functions:
1. $L_{routing}$
2. $T_{routing}$
In the below function all congestion cost computation takes into account the weight.
First we describe these two functions and then we describe how the congestion due to three pin nets are computed.
##### **Congestion cost update using $L_{routing}$:**
The inputs are three pin grid id and net weight. We consider pin grids are $(i_1, j_1)$, $(i_2, j_2)$ and $(i_3, j_3)$ where $i_1 < i_2 < i_3$ and $(j_1 < j_2 < j_3)$ or $(j_1 > j_2 > j_3)$.
1. Add horizontal congestion cost due to the net to grids from $(i_1, j_1)$ to $(i_2-1, j_1)$
2. Add horizontal congestion cost due to the net to grids from $(i_2, j_2)$ to $(i_3-1, j_2)$
3. Add vertical congestion cost due to the net to grids from $(i_2, min(j_1, j_2))$ to $(i_2, max(j_1, j_2) - 1)$.
4. Add vertical congestion cost due to the net to grids from $(i3, min(j_2, j_3))$ to $(i_3, max(j_2, j_3) - 1)$.
##### **Congestion cost update using $T_{routing}$:**
The inputs are three pin grid id and net weight. We consider pin grids as $(i_1, j_1)$, $(i_2, j_2)$ and $(i_3, j_3)$ where $(j_1 <= j_2 <= j_3 )$ or $(j_1 >= j_2 >= j_3)$.
1. $i_{min} = min(i_1, i_2, i_3)$, $i_{max} = max(i_1, i_2, i_3)$
2. Add horizontal congestion cost due to the net to grids from $(i_{min}, j_2)$ to $(i_{max} - 1, j_2)$.
3. Add vertical congestion cost due to the net to the grid from $(i_1, min(j_1, j_2))$ to $(i_1, max(j_1, j_2) - 1)$.
4. Add vertical congestion cost due to the net to the grid from $(i_3, min(j_2, j_3))$ to $(i_3, max(j_2, j_3) - 1)$.
##### **Procedure congestion cost computation due to three-pin nets:**
The inputs are three pin grid locations and the net weight.
1. Sort the pin based on the column. After sorting pin locations are $(i_1, j_1)$, $(i_2, j_2)$ and $(i_3, j_3)$. As it is sorted based on column $i_1 <= i_2 <= i_3$.
2. If $i_1 < i_2$ and $i_2 < i_3$ and $min(j_1, j_3) < j_2$ and $max(j_1, j_3) > j_2$:
1. Update congestion cost using $L_{routing}$.
2. Return.
3. If $i_2 == i_3$ and $i_1 < i_2$ and $j_1 < min(j_2, j_3)$:
1. Add horizontal congestion cost due to the net to grids from $(i_1, j_1)$ to $(i_2-1, j_1)$
2. Add vertical congestion cost due to the net to grids from $(i_2, j_1)$ to $(i_2, max(j_2, j_3) -1)$
3. Return.
4. If $j_2 == j_3$:
1. Add horizontal congestion cost due to the net to grids from $(i_1, j_1)$ to $(i_2 -1, j_1)$
2. Add horizontal congestion cost due to the net to grids from $(i_2, j_2)$ to $(i_3 -1, j_2)$
3. Add vertical congestion cost due to the net to grids from $(i_2, min(j_2, j_3))$ to $(i_2, max(j_2, j_3) - 1)$.
4. Return
5. Update congestion cost using $T_{routing}$.
The following four figures represent the four cases mentioned in the above procedure from point two to point five.
<p align="center">
<img width="300" src="./images/image9.png" alg="ThreePin4">
</p>
<p align="center">
Figure corresponding to point two.
</p>
<p align="center">
<img width="300" src="./images/image5.png" alg="ThreePin5">
</p>
<p align="center">
Figure corresponding to point three.
</p>
<p align="center">
<img width="300" src="./images/image4.png" alg="ThreePin6">
</p>
<p align="center">
Figure corresponding to point four.
</p>
<p align="center">
<img width="300" src="./images/image11.png" alg="ThreePin7">
</p>
<p align="center">
Figure corresponding to point five.
</p>
#### *Congestion due to multi-pin nets where the number of pins is greater than three*
1. Consider the net is a n-pin net where $n > 3$.
2. We break this net into n-1 two pin nets where the source node is the common node.
3. For each two pin nets we update congestion values.
#### *Computation for Smoothing:*
1. **Congestion smoothing = 0.0**
1. Return the grid congestion that is due to net routing: no smoothing is applied.
2. **Congestion smoothing > 0.0 = k** (k is an integer; both CT and our code appear to use the floor of any non-integer smoothing value)
1. Take grid congestion due to net routing
2. For horizontal grid congestion
1. For each gridcell
1. If not out-of-bound, take k gridcells on each side (left/right), divide the current cell entry by the total number of gridcells taken and add the value to the corresponding gridcell.
3. For vertical grid congestion
1. For each gridcell
1. If not out-of-bound, take k gridcells on each side (up/down), divide the current cell entry by the total number of gridcells taken and add the value to the corresponding gridcell.
4. For example, suppose that smoothing = 2 (default value), and we apply it to horizontal grid congestion in four rows of gridcells with respect to the red gridcell highlighted in each row. Then, the blue gridcells in each row show the numbers of gridcells that we divide by (respectively from the top row to the bottom row: 3, 4, 5, 4) when smoothing congestion.
<p align="center">
<img width="300" src="./images/image3.png" alg="CongestionSmooth1">
</p>
#### *Computation for Macro Congestion:*
- For each soft macro + hard MACRO:
- For each gridcell it overlaps with:
- For both horizontal and vertical macro routing congestion map:
1. Find the dimension of overlap, multiply by macro routing allocation
2. Divide by (the grid_cell dimension multiplied by routing per micron)
3. Add to the corresponding gridcell
- Example:
- Given a single hard macro HM_1 (pink rectangle in the figure below), we have two pins instantiated on the top-right and bottom-left, driven by the ports at “P_1” located at the bottom-left of the canvas.
<p align="center">
<img width="300" src="./images/image8.png" alg="MacroCongestion1">
</p>
<p align="center">
<img width="300" src="./images/image6.png" alg="MacroCongestion2">
</p>
<p align="center">
<img width="300" src="./images/image12.png" alg="MacroCongestion3">
</p>
- Whenever there are gridcells partially overlapped, whether in horizontal or vertical direction, we set the vertical congestion of the top gridcells to 0 (if partially overlapped vertically) and we set the horizontal congestion of the right gridcells to 0 (if partially overlapped horizontally).
#### *Computation of the final congestion cost:*
- Adding the Macro allocation congestion and Net routing congestion together for both Vertical and Horizontal congestion map
- Concat both vertical and horizontal congestion maps together.
- Take the top **5**% of the most congested gridcells **in the concatenation**, and average them out to get the final congestion cost.
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment