Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
macroplacement
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
macroplacement
Commits
3dfa0aa5
Commit
3dfa0aa5
authored
Aug 29, 2022
by
Dinple
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
restore placement done
parent
db33a447
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
131 additions
and
34 deletions
+131
-34
CodeElements/Plc_client/plc_client_os.py
+131
-34
No files found.
CodeElements/Plc_client/plc_client_os.py
View file @
3dfa0aa5
...
@@ -9,6 +9,7 @@ from collections import namedtuple
...
@@ -9,6 +9,7 @@ from collections import namedtuple
import
matplotlib.pyplot
as
plt
import
matplotlib.pyplot
as
plt
from
matplotlib.patches
import
Rectangle
from
matplotlib.patches
import
Rectangle
import
numpy
as
np
import
numpy
as
np
import
traceback
,
sys
"""plc_client_os docstrings.
"""plc_client_os docstrings.
...
@@ -40,6 +41,11 @@ class PlacementCost(object):
...
@@ -40,6 +41,11 @@ class PlacementCost(object):
self
.
macro_macro_x_spacing
=
macro_macro_x_spacing
self
.
macro_macro_x_spacing
=
macro_macro_x_spacing
self
.
macro_macro_y_spacing
=
macro_macro_y_spacing
self
.
macro_macro_y_spacing
=
macro_macro_y_spacing
# Update cost computation flags
self
.
FLAG_UPDATE_WIRELENGTH
=
True
self
.
FLAG_UPDATE_DENSITY
=
True
self
.
FLAG_UPDATE_CONGESTION
=
True
# Check netlist existance
# Check netlist existance
assert
os
.
path
.
isfile
(
self
.
netlist_file
)
assert
os
.
path
.
isfile
(
self
.
netlist_file
)
...
@@ -466,13 +472,61 @@ class PlacementCost(object):
...
@@ -466,13 +472,61 @@ class PlacementCost(object):
# validate netlist.pb.txt is on par with .plc
# validate netlist.pb.txt is on par with .plc
if
ifValidate
:
if
ifValidate
:
assert
(
self
.
hard_macro_cnt
==
info_dict
[
'hard_macros_cnt'
])
try
:
assert
(
self
.
hard_macro_pin_cnt
==
info_dict
[
'hard_macro_pins_cnt'
])
assert
(
self
.
hard_macro_cnt
==
info_dict
[
'hard_macros_cnt'
])
assert
(
self
.
soft_macro_cnt
==
info_dict
[
'soft_macros_cnt'
])
assert
(
self
.
hard_macro_pin_cnt
==
info_dict
[
'hard_macro_pins_cnt'
])
assert
(
self
.
soft_macro_pin_cnt
==
info_dict
[
'soft_macro_pins_cnt'
])
assert
(
self
.
soft_macro_cnt
==
info_dict
[
'soft_macros_cnt'
])
assert
(
self
.
port_cnt
==
info_dict
[
'ports_cnt'
])
assert
(
self
.
soft_macro_pin_cnt
==
info_dict
[
'soft_macro_pins_cnt'
])
assert
(
self
.
port_cnt
==
info_dict
[
'ports_cnt'
])
except
AssertionError
:
_
,
_
,
tb
=
sys
.
exc_info
()
traceback
.
print_tb
(
tb
)
tb_info
=
traceback
.
extract_tb
(
tb
)
_
,
line
,
_
,
text
=
tb_info
[
-
1
]
print
(
'[NETLIST/PLC MISMATCH ERROR] at line {} in statement {}'
\
.
format
(
line
,
text
))
exit
(
1
)
# restore placement for each module
try
:
assert
sorted
(
self
.
port_indices
+
\
self
.
hard_macro_indices
+
\
self
.
soft_macro_indices
)
==
list
(
info_dict
[
'node_plc'
]
.
keys
())
except
AssertionError
:
print
(
'[PLC IDICES MISMATCH ERROR]'
)
exit
(
1
)
for
mod_idx
in
info_dict
[
'node_plc'
]
.
keys
():
mod_x
=
mod_y
=
mod_orient
=
mod_ifFixed
=
None
try
:
mod_x
=
float
(
info_dict
[
'node_plc'
][
mod_idx
][
0
])
mod_y
=
float
(
info_dict
[
'node_plc'
][
mod_idx
][
1
])
mod_orient
=
info_dict
[
'node_plc'
][
mod_idx
][
2
]
mod_ifFixed
=
int
(
info_dict
[
'node_plc'
][
mod_idx
][
3
])
except
Exception
as
e
:
print
(
'[PLC PARSER ERROR]
%
s'
%
str
(
e
))
self
.
modules_w_pins
[
mod_idx
]
.
set_pos
(
mod_x
,
mod_y
)
if
mod_orient
and
mod_orient
!=
'-'
:
self
.
modules_w_pins
[
mod_idx
]
.
set_orientation
(
mod_orient
)
if
mod_ifFixed
==
0
:
self
.
modules_w_pins
[
mod_idx
]
.
set_fix_flag
(
False
)
elif
mod_ifFixed
==
1
:
self
.
modules_w_pins
[
mod_idx
]
.
set_fix_flag
(
True
)
# TODO restore placement for each module
# set meta information
self
.
set_canvas_size
(
info_dict
[
'width'
],
info_dict
[
'height'
])
self
.
set_placement_grid
(
info_dict
[
'columns'
],
info_dict
[
'rows'
])
self
.
set_block_name
(
info_dict
[
'block'
])
self
.
set_routes_per_micron
(
info_dict
[
'routes_per_micron_hor'
],
\
info_dict
[
'routes_per_micron_ver'
])
self
.
set_macro_routing_allocation
(
info_dict
[
'routes_used_by_macros_hor'
],
\
info_dict
[
'routes_used_by_macros_ver'
])
self
.
set_congestion_smooth_range
(
info_dict
[
'smoothing_factor'
])
self
.
set_overlap_threshold
(
info_dict
[
'overlap_threshold'
])
def
__update_connection
(
self
):
def
__update_connection
(
self
):
"""
"""
...
@@ -504,11 +558,36 @@ class PlacementCost(object):
...
@@ -504,11 +558,36 @@ class PlacementCost(object):
weight
=
pin
.
get_weight
()
weight
=
pin
.
get_weight
()
macro
.
add_connections
(
inputs
[
k
],
weight
)
macro
.
add_connections
(
inputs
[
k
],
weight
)
def
__update_cost_info
(
self
):
"""
Update wirelength/density/congestion related computation
"""
pass
def
__update_wirelength
(
self
):
"""
Update wirelength computation
"""
pass
def
__update_density
(
self
):
"""
Update density computation
"""
pass
def
__update_congestion
(
self
):
"""
Update congestion computation
"""
pass
def
get_cost
(
self
)
->
float
:
def
get_cost
(
self
)
->
float
:
"""
"""
Compute wirelength cost from wirelength
Compute wirelength cost from wirelength
"""
"""
return
self
.
get_wirelength
()
/
((
self
.
get_canvas_width_height
()[
0
]
+
self
.
get_canvas_width_height
()[
1
])
*
self
.
net_cnt
)
return
self
.
get_wirelength
()
/
((
self
.
get_canvas_width_height
()[
0
]
\
+
self
.
get_canvas_width_height
()[
1
])
*
self
.
net_cnt
)
def
get_area
(
self
)
->
float
:
def
get_area
(
self
)
->
float
:
"""
"""
...
@@ -648,28 +727,8 @@ class PlacementCost(object):
...
@@ -648,28 +727,8 @@ class PlacementCost(object):
def
get_congestion_cost
(
self
):
def
get_congestion_cost
(
self
):
#return max(self.get_H_congestion_cost(), self.get_V_congestion_cost())
#return max(self.get_H_congestion_cost(), self.get_V_congestion_cost())
# TODO need to test if cong is smaller than 5
return
self
.
abu
(
self
.
V_routing_cong
+
self
.
H_routing_cong
,
0.05
)
return
self
.
abu
(
self
.
V_routing_cong
+
self
.
H_routing_cong
,
0.05
)
# temp_cong = [sum(x) for x in zip(self.V_routing_cong, self.H_routing_cong)]
# occupied_cells = sorted([gc for gc in temp_cong if gc != 0.0], reverse=True)
# cong_cost = 0.0
# # take top 10%
# cong_cnt = math.floor(len(temp_cong) * 0.1)
# # if grid cell smaller than 10, take the average over occupied cells
# if len(temp_cong) < 10:
# cong_cost = float(sum(occupied_cells) / len(occupied_cells))
# return cong_cost
# idx = 0
# sum_cong = 0
# # take top 10%
# while idx < cong_cnt and idx < len(occupied_cells):
# sum_cong += occupied_cells[idx]
# idx += 1
# return float(sum_cong / cong_cnt)
def
__get_grid_cell_location
(
self
,
x_pos
,
y_pos
):
def
__get_grid_cell_location
(
self
,
x_pos
,
y_pos
):
"""
"""
...
@@ -829,6 +888,7 @@ class PlacementCost(object):
...
@@ -829,6 +888,7 @@ class PlacementCost(object):
"""
"""
Set grid col/row
Set grid col/row
"""
"""
print
(
"#[PLACEMENT GRID] Col:
%
d, Row:
%
d"
%
(
grid_col
,
grid_row
))
self
.
grid_col
=
grid_col
self
.
grid_col
=
grid_col
self
.
grid_row
=
grid_row
self
.
grid_row
=
grid_row
...
@@ -858,6 +918,12 @@ class PlacementCost(object):
...
@@ -858,6 +918,12 @@ class PlacementCost(object):
Return Project name
Return Project name
"""
"""
return
self
.
project_name
return
self
.
project_name
def
set_block_name
(
self
,
block_name
:
str
)
->
None
:
"""
Return Block name
"""
self
.
block_name
=
block_name
def
get_block_name
(
self
)
->
str
:
def
get_block_name
(
self
)
->
str
:
"""
"""
...
@@ -869,6 +935,7 @@ class PlacementCost(object):
...
@@ -869,6 +935,7 @@ class PlacementCost(object):
"""
"""
Set Routes per Micron
Set Routes per Micron
"""
"""
print
(
"#[ROUTES PER MICRON] Hor:
%.2
f, Ver:
%.2
f"
%
(
hroutes_per_micron
,
vroutes_per_micron
))
self
.
hroutes_per_micron
=
hroutes_per_micron
self
.
hroutes_per_micron
=
hroutes_per_micron
self
.
vroutes_per_micron
=
vroutes_per_micron
self
.
vroutes_per_micron
=
vroutes_per_micron
...
@@ -882,7 +949,8 @@ class PlacementCost(object):
...
@@ -882,7 +949,8 @@ class PlacementCost(object):
"""
"""
Set congestion smooth range
Set congestion smooth range
"""
"""
self
.
smooth_range
=
int
(
smooth_range
)
print
(
"#[CONGESTION SMOOTH RANGE] Smooth Range:
%
d"
%
(
smooth_range
))
self
.
smooth_range
=
math
.
floor
(
smooth_range
)
def
get_congestion_smooth_range
(
self
)
->
float
:
def
get_congestion_smooth_range
(
self
)
->
float
:
"""
"""
...
@@ -894,6 +962,7 @@ class PlacementCost(object):
...
@@ -894,6 +962,7 @@ class PlacementCost(object):
"""
"""
Set Overlap Threshold
Set Overlap Threshold
"""
"""
print
(
"#[OVERLAP THRESHOLD] Threshold:
%.4
f"
%
(
overlap_thres
))
self
.
overlap_thres
=
overlap_thres
self
.
overlap_thres
=
overlap_thres
def
get_overlap_threshold
(
self
)
->
float
:
def
get_overlap_threshold
(
self
)
->
float
:
...
@@ -1481,7 +1550,7 @@ class PlacementCost(object):
...
@@ -1481,7 +1550,7 @@ class PlacementCost(object):
def
get_node_location
(
self
,
node_idx
):
def
get_node_location
(
self
,
node_idx
):
pass
pass
def
get_grid_cell_of_node
(
self
,
node_idx
):
def
get_grid_cell_of_node
(
self
,
node_idx
):
""" if grid_cell at grid crossing, break-tie to upper right
""" if grid_cell at grid crossing, break-tie to upper right
"""
"""
...
@@ -1593,7 +1662,7 @@ class PlacementCost(object):
...
@@ -1593,7 +1662,7 @@ class PlacementCost(object):
plt
.
show
()
plt
.
show
()
plt
.
close
(
'all'
)
plt
.
close
(
'all'
)
#
Internal Util Function For Testing, Not visible at original CT
#
[TEST FLAG] Internal Util Function For Testing
def
__random_swap_placement
(
self
,
final_plc
,
same_block
=
False
):
def
__random_swap_placement
(
self
,
final_plc
,
same_block
=
False
):
"""
"""
Swapping HARD MACRO placement from final_plc file.
Swapping HARD MACRO placement from final_plc file.
...
@@ -1615,7 +1684,7 @@ class PlacementCost(object):
...
@@ -1615,7 +1684,7 @@ class PlacementCost(object):
self
.
side
=
side
# "BOTTOM", "TOP", "LEFT", "RIGHT"
self
.
side
=
side
# "BOTTOM", "TOP", "LEFT", "RIGHT"
self
.
sink
=
{}
# standard cells, macro pins, ports driven by this cell
self
.
sink
=
{}
# standard cells, macro pins, ports driven by this cell
self
.
connection
=
{}
# [module_name] => edge degree
self
.
connection
=
{}
# [module_name] => edge degree
self
.
ifFixed
=
True
self
.
fix_flag
=
True
self
.
placement
=
0
# needs to be updated
self
.
placement
=
0
# needs to be updated
def
get_name
(
self
):
def
get_name
(
self
):
...
@@ -1683,6 +1752,12 @@ class PlacementCost(object):
...
@@ -1683,6 +1752,12 @@ class PlacementCost(object):
def
get_type
(
self
):
def
get_type
(
self
):
return
"PORT"
return
"PORT"
def
set_fix_flag
(
self
,
fix_flag
):
self
.
fix_flag
=
fix_flag
def
get_fix_flag
(
self
):
return
self
.
fix_flag
class
SoftMacro
:
class
SoftMacro
:
def
__init__
(
self
,
name
,
width
,
height
,
x
=
0.0
,
y
=
0.0
):
def
__init__
(
self
,
name
,
width
,
height
,
x
=
0.0
,
y
=
0.0
):
...
@@ -1692,7 +1767,8 @@ class PlacementCost(object):
...
@@ -1692,7 +1767,8 @@ class PlacementCost(object):
self
.
x
=
float
(
x
)
self
.
x
=
float
(
x
)
self
.
y
=
float
(
y
)
self
.
y
=
float
(
y
)
self
.
connection
=
{}
# [module_name] => edge degree
self
.
connection
=
{}
# [module_name] => edge degree
self
.
ifFixed
=
False
self
.
orientation
=
None
self
.
fix_flag
=
False
self
.
ifPlaced
=
True
self
.
ifPlaced
=
True
self
.
location
=
0
# needs to be updated
self
.
location
=
0
# needs to be updated
...
@@ -1734,6 +1810,12 @@ class PlacementCost(object):
...
@@ -1734,6 +1810,12 @@ class PlacementCost(object):
def
get_connection
(
self
):
def
get_connection
(
self
):
return
self
.
connection
return
self
.
connection
def
set_orientation
(
self
,
orientation
):
self
.
orientation
=
orientation
def
get_orientation
(
self
):
return
self
.
orientation
def
get_area
(
self
):
def
get_area
(
self
):
return
self
.
width
*
self
.
height
return
self
.
width
*
self
.
height
...
@@ -1749,6 +1831,12 @@ class PlacementCost(object):
...
@@ -1749,6 +1831,12 @@ class PlacementCost(object):
def
get_location
(
self
):
def
get_location
(
self
):
return
self
.
location
return
self
.
location
def
set_fix_flag
(
self
,
fix_flag
):
self
.
fix_flag
=
fix_flag
def
get_fix_flag
(
self
):
return
self
.
fix_flag
class
SoftMacroPin
:
class
SoftMacroPin
:
def
__init__
(
self
,
name
,
def
__init__
(
self
,
name
,
...
@@ -1826,7 +1914,7 @@ class PlacementCost(object):
...
@@ -1826,7 +1914,7 @@ class PlacementCost(object):
self
.
y
=
float
(
y
)
self
.
y
=
float
(
y
)
self
.
orientation
=
orientation
self
.
orientation
=
orientation
self
.
connection
=
{}
# [module_name] => edge degree
self
.
connection
=
{}
# [module_name] => edge degree
self
.
ifFixed
=
False
self
.
fix_flag
=
False
self
.
ifPlaced
=
True
self
.
ifPlaced
=
True
self
.
location
=
0
# needs to be updated
self
.
location
=
0
# needs to be updated
...
@@ -1868,6 +1956,9 @@ class PlacementCost(object):
...
@@ -1868,6 +1956,9 @@ class PlacementCost(object):
def
set_orientation
(
self
,
orientation
):
def
set_orientation
(
self
,
orientation
):
self
.
orientation
=
orientation
self
.
orientation
=
orientation
def
get_orientation
(
self
):
return
self
.
orientation
def
get_type
(
self
):
def
get_type
(
self
):
return
"MACRO"
return
"MACRO"
...
@@ -1886,6 +1977,12 @@ class PlacementCost(object):
...
@@ -1886,6 +1977,12 @@ class PlacementCost(object):
def
get_location
(
self
):
def
get_location
(
self
):
return
self
.
location
return
self
.
location
def
set_fix_flag
(
self
,
fix_flag
):
self
.
fix_flag
=
fix_flag
def
get_fix_flag
(
self
):
return
self
.
fix_flag
class
HardMacroPin
:
class
HardMacroPin
:
def
__init__
(
self
,
name
,
def
__init__
(
self
,
name
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment