Commit 158db901 by sakundu

Merge branch 'main' of github.com:TILOS-AI-Institute/MacroPlacement into main

parents 286dd9bd 06a420cc
......@@ -4,11 +4,34 @@ Flows/job
Flows/util/__pycache__
CodeElements/*/*/__pycache__
CodeElements/Plc_client/test/
CodeElements/Plc_client/test/*/*
CodeElements/Plc_client/plc_client_os.py
CodeElements/Plc_client/test/*
CodeElements/Plc_client/__pycache__/*
CodeElements/Plc_client/proto_reader.py
CodeElements/Plc_client/plc_client.py
CodeElements/failed_proxy_plc/*
CodeElements/EvalCT/test/g657_ub5_nruns10_c5_r3_v3_rc1
CodeElements/EvalCT/snapshot*
CodeElements/EvalCT/circuit_training
CodeElements/EvalCT/__pycache__/
CodeElements/EvalCT/eval_run*.plc
CodeElements/EvalCT/eval_run*.plc
CodeElements/EvalCT/saved_policy/run_00/111/train/*
CodeElements/EvalCT/saved_policy/run_00/111/snapshot*.plc
CodeElements/EvalCT/saved_policy/run_00/111/rl*.plc
CodeElements/EvalCT/saved_policy/run_os_64128_g657_ub5_nruns10_c5_r3_v3_rc1
CodeElements/epoch_*.plc
CodeElements/FDPlacement/test/*
CodeElements/Plc_client/placement_util*.py
CodeElements/StatTest/test/ariane/*_vs_*
CodeElements/StatTest/test/flow2_68_1.3_ct/*
CodeElements/StatTest/test/ariane/*.plc
CodeElements/*/__pycache__/*
CodeElements/*.png
CodeElements/StatTest/*.csv
CodeElements/os.txt
CodeElements/EvalCT/test/ariane/*.plc
CodeElements/FDPlacement/fd.txt
CodeElements/StatTest/test/ariane/*.pb.txt
CodeElements/Plc_client/failed_proxy_plc/*
__pycache__/
__pycache__
......
# Circuit Training Model Evaulation
## Quick Start
First, make sure you are under `CodeElements/EvalCT/`. To run `eval_ct.py`, we need to download `circuit_training` code under the same directory. Run the following command to get the stable version that we have tested.
```
# Compatible with Revision #90. Latest Version might cause errors
svn export -r 90 --force https://github.com/google-research/circuit_training.git/trunk/circuit_training
```
Next, we need to prepare your trained policy and the testcase you want to evaluate on. Assume you have trained models (which usually can be found under `./logs`), copy the run folder into `saved_model` folder. Make sure your testcase is under `./test`. The `ckptID` is the policy checkpoint ID saved after each iteration.
Finally, run the following command with path to netlist file, initial placement file and model run directory path.
```
$ python3 -m eval_ct --netlist ./test/ariane/netlist.pb.txt\
--plc ./test/ariane/initial.plc\
--rundir run_00\
--ckptID policy_checkpoint_0000103984
```
The placement will be stored under `CodeElements/EvalCT/` and named as `eval_[RUN_DIR]_to_[TESTCASE].plc`.
## Trained Policy
We are providing one of the run we trained from scratch using Google's Ariane testcase. **This should not be taken as representing the potential of Circuit Training**. We are only providing these trained weights here for the sake of testing. Please feel free to load any of your own trained weights. You may find similar file structure under `./logs` after training.
## View Your Result
You can view the result by supplying this placement file into the open-sourced Plc_client testbench and use the `display_canvas` function.
import collections
import functools
import os
import time
from typing import Text
import statistics
import re
from absl import app
from absl import flags
from absl.flags import argparse_flags
from circuit_training.environment import environment
from circuit_training.environment import placement_util
from tf_agents.experimental.distributed import reverb_variable_container
from tf_agents.metrics import py_metric
from tf_agents.metrics import py_metrics
from tf_agents.policies import greedy_policy # pylint: disable=unused-import
from tf_agents.policies import py_tf_eager_policy
from tf_agents.policies import policy_loader
from tf_agents.train import actor
from tf_agents.train import learner
from tf_agents.train.utils import train_utils
from tf_agents.trajectories import trajectory
from tf_agents.utils import common
from tf_agents.policies import greedy_policy # pylint: disable=unused-import
from tf_agents.system import system_multiprocessing as multiprocessing
"""
Example
At ./MacroPlacement/CodeElement/EvalCT, run the following command:
$ cd EvalCT && python3 -m eval_ct --netlist ./test/ariane/netlist.pb.txt\
--plc ./test/ariane/initial.plc\
--rundir run_00\
--ckptID policy_checkpoint_0000103984\
&& cd -
"""
# InfoMetric_wirelength = 0.09238692254177283
# InfoMetric_congestion = 0.9468230846211636
# InfoMetric_density = 0.5462616496124097
class InfoMetric(py_metric.PyStepMetric):
"""Observer for graphing the environment info metrics."""
def __init__(
self,
env,
info_metric_key: Text,
buffer_size: int = 1,
name: Text = 'InfoMetric',
):
"""Observer reporting TensorBoard metrics at the end of each episode.
Args:
env: environment.
info_metric_key: a string key from the environment info to report,
e.g. wirelength, density, congestion.
buffer_size: size of the buffer for calculating the aggregated metrics.
name: name of the observer object.
"""
super(InfoMetric, self).__init__(name + '_' + info_metric_key)
self._env = env
self._info_metric_key = info_metric_key
self._buffer = collections.deque(maxlen=buffer_size)
def call(self, traj: trajectory.Trajectory):
"""Report the requested metrics at the end of each episode."""
# We collect the metrics from the info from the environment instead.
# The traj argument is kept to be compatible with the actor/learner API
# for metrics.
del traj
if self._env.done:
# placement_util.save_placement(self._env._plc, './reload_weight.plc', '')
metric_value = self._env.get_info()[self._info_metric_key]
self._buffer.append(metric_value)
def result(self):
return statistics.mean(self._buffer)
def reset(self):
self._buffer.clear()
def evaulate(model_dir, ckpt_id, create_env_fn):
# Create the path for the serialized greedy policy.
policy_saved_model_path = os.path.join(model_dir,
learner.POLICY_SAVED_MODEL_DIR,
learner.GREEDY_POLICY_SAVED_MODEL_DIR)
try:
assert os.path.isdir(policy_saved_model_path)
print("#[POLICY SAVED MODEL PATH] " + policy_saved_model_path)
except AssertionError:
print("[ERROR POLICY SAVED MODEL PATH NOT FOUND] " + policy_saved_model_path)
exit(0)
policy_saved_chkpt_path = os.path.join(model_dir,
learner.POLICY_SAVED_MODEL_DIR,
"checkpoints", ckpt_id)
try:
assert os.path.isdir(policy_saved_chkpt_path)
print("#[POLICY SAVED CHECKPOINT PATH] " + policy_saved_chkpt_path)
except AssertionError:
print("[ERROR POLICY SAVED CHECKPOINT PATH NOT FOUND] " + policy_saved_chkpt_path)
exit(0)
saved_model_pb_path = os.path.join(policy_saved_model_path, 'saved_model.pb')
try:
assert os.path.isfile(saved_model_pb_path)
print("#[SAVED MODEL PB PATH] " + saved_model_pb_path)
except AssertionError:
print("[ERROR SAVE MODEL PB PATH NOT FOUND] " + saved_model_pb_path)
exit(0)
policy = policy_loader.load(policy_saved_model_path, policy_saved_chkpt_path)
policy.get_initial_state()
print(policy.variables()[0].numpy())
train_step = train_utils.create_train_step()
# Create the environment.
env = create_env_fn()
# Create the evaluator actor.
info_metrics = [
InfoMetric(env, 'wirelength'),
InfoMetric(env, 'congestion'),
InfoMetric(env, 'density'),
]
eval_actor = actor.Actor(
env,
policy,
train_step,
episodes_per_run=1,
summary_dir=os.path.join(model_dir, learner.TRAIN_DIR, 'eval'),
metrics=[
py_metrics.NumberOfEpisodes(),
py_metrics.EnvironmentSteps(),
py_metrics.AverageReturnMetric(
name='eval_episode_return', buffer_size=1),
py_metrics.AverageEpisodeLengthMetric(buffer_size=1),
] + info_metrics,
name='performance')
eval_actor.run_and_log()
def main(args):
NETLIST_FILE = args.netlist
INIT_PLACEMENT = args.plc
POLICY_CHECKPOINT_ID = args.ckptID
GLOBAL_SEED = 111
CD_RUNTIME = False
RUN_NAME = args.rundir
# extract eval testcase name
EVAL_TESTCASE = re.search("/test/(.+?)/netlist.pb.txt", NETLIST_FILE).group(1)
create_env_fn = functools.partial(
environment.create_circuit_environment,
netlist_file=NETLIST_FILE,
init_placement=INIT_PLACEMENT,
is_eval=True,
save_best_cost=True,
output_plc_file=str('./eval_' + RUN_NAME + '_to_' + EVAL_TESTCASE + '.plc'),
global_seed=GLOBAL_SEED,
cd_finetune=CD_RUNTIME
)
evaulate(model_dir=os.path.join("./saved_policy", RUN_NAME, str(GLOBAL_SEED)),
ckpt_id=POLICY_CHECKPOINT_ID, create_env_fn=create_env_fn)
def parse_flags(argv):
parser = argparse_flags.ArgumentParser(
description='An argparse + app.run example')
parser.add_argument("--netlist", required=True,
help="Path to netlist in pb.txt")
parser.add_argument("--plc", required=True,
help="Path to plc in .plc")
parser.add_argument("--rundir", required=True,
help="Path to run directory that contains saved policies")
parser.add_argument("--ckptID", required=True,
help="Policy checkpoint ID")
return parser.parse_args(argv[1:])
if __name__ == '__main__':
app.run(main, flags_parser=parse_flags)
\ No newline at end of file
dict_value {
fields {
key: "collect_data_spec"
value {
named_tuple_value {
name: "Trajectory"
values {
key: "step_type"
value {
tensor_spec_value {
name: "step_type"
shape {
}
dtype: DT_INT32
}
}
}
values {
key: "observation"
value {
dict_value {
fields {
key: "current_node"
value {
bounded_tensor_spec_value {
name: "observation/current_node"
shape {
dim {
size: 1
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 4999
}
}
}
}
fields {
key: "edge_counts"
value {
bounded_tensor_spec_value {
name: "observation/edge_counts"
shape {
dim {
size: 5000
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 28399
}
}
}
}
fields {
key: "grid_cols"
value {
bounded_tensor_spec_value {
name: "observation/grid_cols"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "grid_rows"
value {
bounded_tensor_spec_value {
name: "observation/grid_rows"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "horizontal_routes_per_micron"
value {
bounded_tensor_spec_value {
name: "observation/horizontal_routes_per_micron"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 100.0
}
}
}
}
fields {
key: "is_node_placed"
value {
bounded_tensor_spec_value {
name: "observation/is_node_placed"
shape {
dim {
size: 5000
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 1
}
}
}
}
fields {
key: "locations_x"
value {
bounded_tensor_spec_value {
name: "observation/locations_x"
shape {
dim {
size: 5000
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "locations_y"
value {
bounded_tensor_spec_value {
name: "observation/locations_y"
shape {
dim {
size: 5000
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "macro_horizontal_routing_allocation"
value {
bounded_tensor_spec_value {
name: "observation/macro_horizontal_routing_allocation"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 100.0
}
}
}
}
fields {
key: "macro_vertical_routing_allocation"
value {
bounded_tensor_spec_value {
name: "observation/macro_vertical_routing_allocation"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 100.0
}
}
}
}
fields {
key: "macros_h"
value {
bounded_tensor_spec_value {
name: "observation/macros_h"
shape {
dim {
size: 5000
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "macros_w"
value {
bounded_tensor_spec_value {
name: "observation/macros_w"
shape {
dim {
size: 5000
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "mask"
value {
bounded_tensor_spec_value {
name: "observation/mask"
shape {
dim {
size: 16384
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 1
}
}
}
}
fields {
key: "node_types"
value {
bounded_tensor_spec_value {
name: "observation/node_types"
shape {
dim {
size: 5000
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 3
}
}
}
}
fields {
key: "normalized_num_edges"
value {
bounded_tensor_spec_value {
name: "observation/normalized_num_edges"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "normalized_num_hard_macros"
value {
bounded_tensor_spec_value {
name: "observation/normalized_num_hard_macros"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "normalized_num_port_clusters"
value {
bounded_tensor_spec_value {
name: "observation/normalized_num_port_clusters"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "normalized_num_soft_macros"
value {
bounded_tensor_spec_value {
name: "observation/normalized_num_soft_macros"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "sparse_adj_i"
value {
bounded_tensor_spec_value {
name: "observation/sparse_adj_i"
shape {
dim {
size: 28400
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 4999
}
}
}
}
fields {
key: "sparse_adj_j"
value {
bounded_tensor_spec_value {
name: "observation/sparse_adj_j"
shape {
dim {
size: 28400
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 4999
}
}
}
}
fields {
key: "sparse_adj_weight"
value {
bounded_tensor_spec_value {
name: "observation/sparse_adj_weight"
shape {
dim {
size: 28400
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 100.0
}
}
}
}
fields {
key: "vertical_routes_per_micron"
value {
bounded_tensor_spec_value {
name: "observation/vertical_routes_per_micron"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 100.0
}
}
}
}
}
}
}
values {
key: "action"
value {
bounded_tensor_spec_value {
name: "action"
shape {
}
dtype: DT_INT64
minimum {
dtype: DT_INT64
tensor_shape {
}
int64_val: 0
}
maximum {
dtype: DT_INT64
tensor_shape {
}
int64_val: 16383
}
}
}
}
values {
key: "policy_info"
value {
dict_value {
fields {
key: "dist_params"
value {
dict_value {
fields {
key: "logits"
value {
tensor_spec_value {
name: "GrlPolicyModel_logits"
shape {
dim {
size: 16384
}
}
dtype: DT_FLOAT
}
}
}
}
}
}
fields {
key: "value_prediction"
value {
tensor_spec_value {
shape {
}
dtype: DT_FLOAT
}
}
}
}
}
}
values {
key: "next_step_type"
value {
tensor_spec_value {
name: "step_type"
shape {
}
dtype: DT_INT32
}
}
}
values {
key: "reward"
value {
tensor_spec_value {
name: "reward"
shape {
}
dtype: DT_FLOAT
}
}
}
values {
key: "discount"
value {
bounded_tensor_spec_value {
name: "discount"
shape {
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
}
}
}
fields {
key: "policy_state_spec"
value {
tuple_value {
}
}
}
}
dict_value {
fields {
key: "collect_data_spec"
value {
named_tuple_value {
name: "Trajectory"
values {
key: "step_type"
value {
tensor_spec_value {
name: "step_type"
shape {
}
dtype: DT_INT32
}
}
}
values {
key: "observation"
value {
dict_value {
fields {
key: "current_node"
value {
bounded_tensor_spec_value {
name: "observation/current_node"
shape {
dim {
size: 1
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 4999
}
}
}
}
fields {
key: "edge_counts"
value {
bounded_tensor_spec_value {
name: "observation/edge_counts"
shape {
dim {
size: 5000
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 28399
}
}
}
}
fields {
key: "grid_cols"
value {
bounded_tensor_spec_value {
name: "observation/grid_cols"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "grid_rows"
value {
bounded_tensor_spec_value {
name: "observation/grid_rows"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "horizontal_routes_per_micron"
value {
bounded_tensor_spec_value {
name: "observation/horizontal_routes_per_micron"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 100.0
}
}
}
}
fields {
key: "is_node_placed"
value {
bounded_tensor_spec_value {
name: "observation/is_node_placed"
shape {
dim {
size: 5000
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 1
}
}
}
}
fields {
key: "locations_x"
value {
bounded_tensor_spec_value {
name: "observation/locations_x"
shape {
dim {
size: 5000
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "locations_y"
value {
bounded_tensor_spec_value {
name: "observation/locations_y"
shape {
dim {
size: 5000
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "macro_horizontal_routing_allocation"
value {
bounded_tensor_spec_value {
name: "observation/macro_horizontal_routing_allocation"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 100.0
}
}
}
}
fields {
key: "macro_vertical_routing_allocation"
value {
bounded_tensor_spec_value {
name: "observation/macro_vertical_routing_allocation"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 100.0
}
}
}
}
fields {
key: "macros_h"
value {
bounded_tensor_spec_value {
name: "observation/macros_h"
shape {
dim {
size: 5000
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "macros_w"
value {
bounded_tensor_spec_value {
name: "observation/macros_w"
shape {
dim {
size: 5000
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "mask"
value {
bounded_tensor_spec_value {
name: "observation/mask"
shape {
dim {
size: 16384
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 1
}
}
}
}
fields {
key: "node_types"
value {
bounded_tensor_spec_value {
name: "observation/node_types"
shape {
dim {
size: 5000
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 3
}
}
}
}
fields {
key: "normalized_num_edges"
value {
bounded_tensor_spec_value {
name: "observation/normalized_num_edges"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "normalized_num_hard_macros"
value {
bounded_tensor_spec_value {
name: "observation/normalized_num_hard_macros"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "normalized_num_port_clusters"
value {
bounded_tensor_spec_value {
name: "observation/normalized_num_port_clusters"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "normalized_num_soft_macros"
value {
bounded_tensor_spec_value {
name: "observation/normalized_num_soft_macros"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "sparse_adj_i"
value {
bounded_tensor_spec_value {
name: "observation/sparse_adj_i"
shape {
dim {
size: 28400
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 4999
}
}
}
}
fields {
key: "sparse_adj_j"
value {
bounded_tensor_spec_value {
name: "observation/sparse_adj_j"
shape {
dim {
size: 28400
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 4999
}
}
}
}
fields {
key: "sparse_adj_weight"
value {
bounded_tensor_spec_value {
name: "observation/sparse_adj_weight"
shape {
dim {
size: 28400
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 100.0
}
}
}
}
fields {
key: "vertical_routes_per_micron"
value {
bounded_tensor_spec_value {
name: "observation/vertical_routes_per_micron"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 100.0
}
}
}
}
}
}
}
values {
key: "action"
value {
bounded_tensor_spec_value {
name: "action"
shape {
}
dtype: DT_INT64
minimum {
dtype: DT_INT64
tensor_shape {
}
int64_val: 0
}
maximum {
dtype: DT_INT64
tensor_shape {
}
int64_val: 16383
}
}
}
}
values {
key: "policy_info"
value {
tuple_value {
}
}
}
values {
key: "next_step_type"
value {
tensor_spec_value {
name: "step_type"
shape {
}
dtype: DT_INT32
}
}
}
values {
key: "reward"
value {
tensor_spec_value {
name: "reward"
shape {
}
dtype: DT_FLOAT
}
}
}
values {
key: "discount"
value {
bounded_tensor_spec_value {
name: "discount"
shape {
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
}
}
}
fields {
key: "policy_state_spec"
value {
tuple_value {
}
}
}
}
dict_value {
fields {
key: "collect_data_spec"
value {
named_tuple_value {
name: "Trajectory"
values {
key: "step_type"
value {
tensor_spec_value {
name: "step_type"
shape {
}
dtype: DT_INT32
}
}
}
values {
key: "observation"
value {
dict_value {
fields {
key: "current_node"
value {
bounded_tensor_spec_value {
name: "observation/current_node"
shape {
dim {
size: 1
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 4999
}
}
}
}
fields {
key: "edge_counts"
value {
bounded_tensor_spec_value {
name: "observation/edge_counts"
shape {
dim {
size: 5000
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 28399
}
}
}
}
fields {
key: "grid_cols"
value {
bounded_tensor_spec_value {
name: "observation/grid_cols"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "grid_rows"
value {
bounded_tensor_spec_value {
name: "observation/grid_rows"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "horizontal_routes_per_micron"
value {
bounded_tensor_spec_value {
name: "observation/horizontal_routes_per_micron"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 100.0
}
}
}
}
fields {
key: "is_node_placed"
value {
bounded_tensor_spec_value {
name: "observation/is_node_placed"
shape {
dim {
size: 5000
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 1
}
}
}
}
fields {
key: "locations_x"
value {
bounded_tensor_spec_value {
name: "observation/locations_x"
shape {
dim {
size: 5000
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "locations_y"
value {
bounded_tensor_spec_value {
name: "observation/locations_y"
shape {
dim {
size: 5000
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "macro_horizontal_routing_allocation"
value {
bounded_tensor_spec_value {
name: "observation/macro_horizontal_routing_allocation"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 100.0
}
}
}
}
fields {
key: "macro_vertical_routing_allocation"
value {
bounded_tensor_spec_value {
name: "observation/macro_vertical_routing_allocation"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 100.0
}
}
}
}
fields {
key: "macros_h"
value {
bounded_tensor_spec_value {
name: "observation/macros_h"
shape {
dim {
size: 5000
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "macros_w"
value {
bounded_tensor_spec_value {
name: "observation/macros_w"
shape {
dim {
size: 5000
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "mask"
value {
bounded_tensor_spec_value {
name: "observation/mask"
shape {
dim {
size: 16384
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 1
}
}
}
}
fields {
key: "node_types"
value {
bounded_tensor_spec_value {
name: "observation/node_types"
shape {
dim {
size: 5000
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 3
}
}
}
}
fields {
key: "normalized_num_edges"
value {
bounded_tensor_spec_value {
name: "observation/normalized_num_edges"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "normalized_num_hard_macros"
value {
bounded_tensor_spec_value {
name: "observation/normalized_num_hard_macros"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "normalized_num_port_clusters"
value {
bounded_tensor_spec_value {
name: "observation/normalized_num_port_clusters"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "normalized_num_soft_macros"
value {
bounded_tensor_spec_value {
name: "observation/normalized_num_soft_macros"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
fields {
key: "sparse_adj_i"
value {
bounded_tensor_spec_value {
name: "observation/sparse_adj_i"
shape {
dim {
size: 28400
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 4999
}
}
}
}
fields {
key: "sparse_adj_j"
value {
bounded_tensor_spec_value {
name: "observation/sparse_adj_j"
shape {
dim {
size: 28400
}
}
dtype: DT_INT32
minimum {
dtype: DT_INT32
tensor_shape {
}
int_val: 0
}
maximum {
dtype: DT_INT32
tensor_shape {
}
int_val: 4999
}
}
}
}
fields {
key: "sparse_adj_weight"
value {
bounded_tensor_spec_value {
name: "observation/sparse_adj_weight"
shape {
dim {
size: 28400
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 100.0
}
}
}
}
fields {
key: "vertical_routes_per_micron"
value {
bounded_tensor_spec_value {
name: "observation/vertical_routes_per_micron"
shape {
dim {
size: 1
}
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 100.0
}
}
}
}
}
}
}
values {
key: "action"
value {
bounded_tensor_spec_value {
name: "action"
shape {
}
dtype: DT_INT64
minimum {
dtype: DT_INT64
tensor_shape {
}
int64_val: 0
}
maximum {
dtype: DT_INT64
tensor_shape {
}
int64_val: 16383
}
}
}
}
values {
key: "policy_info"
value {
tuple_value {
}
}
}
values {
key: "next_step_type"
value {
tensor_spec_value {
name: "step_type"
shape {
}
dtype: DT_INT32
}
}
}
values {
key: "reward"
value {
tensor_spec_value {
name: "reward"
shape {
}
dtype: DT_FLOAT
}
}
}
values {
key: "discount"
value {
bounded_tensor_spec_value {
name: "discount"
shape {
}
dtype: DT_FLOAT
minimum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 0.0
}
maximum {
dtype: DT_FLOAT
tensor_shape {
}
float_val: 1.0
}
}
}
}
}
}
}
fields {
key: "policy_state_spec"
value {
tuple_value {
}
}
}
}
# Placement file for Circuit Training
# Source input file(s) : environment/test_data/ariane/netlist.pb.txt
# This file : environment/test_data/ariane/initial.plc
# Date : 2022-03-13 09:30:00
# Columns : 35 Rows : 33
# Width : 356.592 Height : 356.640
# Area : 99908.9764139
# Wirelength : 0.0
# Wirelength cost : 0.0
# Congestion cost : 0.0
# Block : ariane
# Routes per micron, hor : 70.33 ver : 74.51
# Routes used by macros, hor : 51.79 ver : 51.79
# Smoothing factor : 2
# Overlap threshold : 0.004
#
#
#
# Counts of node types:
# HARD_MACROs : 133
# HARD_MACRO_PINs : 11970
# MACROs : 932
# MACRO_PINs : 22802
# PORTs : 1231
# SOFT_MACROs : 799
# SOFT_MACRO_PINs : 10832
# STDCELLs : 0
#
# node_index x y orientation fixed
0 155.268 0.1975 - 1
1 216.676 0.1975 - 1
2 48.108 0.1975 - 1
3 200.032 0.1975 - 1
4 201.704 0.1975 - 1
5 202.388 0.1975 - 1
6 201.324 0.1975 - 1
7 203.072 0.1975 - 1
8 201.172 0.1975 - 1
9 203.984 0.1975 - 1
10 203.224 0.1975 - 1
11 203.832 0.1975 - 1
12 204.364 0.1975 - 1
13 204.212 0.1975 - 1
14 205.048 0.1975 - 1
15 206.036 0.1975 - 1
16 206.72 0.1975 - 1
17 213.408 0.1975 - 1
18 204.896 0.1975 - 1
19 212.952 0.1975 - 1
20 208.544 0.1975 - 1
21 209.988 0.1975 - 1
22 213.256 0.1975 - 1
23 210.368 0.1975 - 1
24 213.104 0.1975 - 1
25 211.432 0.1975 - 1
26 208.924 0.1975 - 1
27 209.076 0.1975 - 1
28 203.376 0.1975 - 1
29 205.2 0.1975 - 1
30 199.348 0.1975 - 1
31 200.26 0.1975 - 1
32 198.74 0.1975 - 1
33 199.5 0.1975 - 1
34 197.6 0.1975 - 1
35 199.88 0.1975 - 1
36 196.308 0.1975 - 1
37 199.652 0.1975 - 1
38 196.46 0.1975 - 1
39 196.992 0.1975 - 1
40 193.952 0.1975 - 1
41 195.7 0.1975 - 1
42 194.104 0.1975 - 1
43 195.852 0.1975 - 1
44 190.684 0.1975 - 1
45 192.812 0.1975 - 1
46 189.924 0.1975 - 1
47 193.8 0.1975 - 1
48 192.128 0.1975 - 1
49 191.824 0.1975 - 1
50 190.076 0.1975 - 1
51 196.156 0.1975 - 1
52 191.976 0.1975 - 1
53 196.004 0.1975 - 1
54 187.872 0.1975 - 1
55 195.396 0.1975 - 1
56 187.72 0.1975 - 1
57 195.548 0.1975 - 1
58 191.672 0.1975 - 1
59 191.064 0.1975 - 1
60 191.52 0.1975 - 1
61 187.568 0.1975 - 1
62 190.228 0.1975 - 1
63 186.124 0.1975 - 1
64 194.256 0.1975 - 1
65 196.612 0.1975 - 1
66 196.764 0.1975 - 1
67 172.216 0.1975 - 1
68 179.36 0.1975 - 1
69 182.4 0.1975 - 1
70 181.412 0.1975 - 1
71 178.22 0.1975 - 1
72 169.252 0.1975 - 1
73 178.372 0.1975 - 1
74 172.368 0.1975 - 1
75 178.524 0.1975 - 1
76 169.404 0.1975 - 1
77 76.608 0.226 - 1
78 88.92 0.1975 - 1
79 85.88 0.1975 - 1
80 105.84 0.177 - 1
81 77.9 0.1975 - 1
82 113.316 0.1975 - 1
83 75.924 0.1975 - 1
84 109.82 0.1975 - 1
85 63.536 0.1975 - 1
86 113.62 0.1975 - 1
87 76.836 0.1975 - 1
88 76.684 0.1975 - 1
89 99.484 0.1975 - 1
90 111.568 0.1975 - 1
91 107.856 0.177 - 1
92 76.988 0.1975 - 1
93 85.68 0.226 - 1
94 77.748 0.1975 - 1
95 85.576 0.1975 - 1
96 77.14 0.1975 - 1
97 103.824 0.226 - 1
98 85.196 0.1975 - 1
99 108.376 0.1975 - 1
100 77.292 0.1975 - 1
101 111.188 0.1975 - 1
102 60.192 0.1975 - 1
103 106.78 0.1975 - 1
104 87.932 0.1975 - 1
105 109.212 0.1975 - 1
106 80.028 0.1975 - 1
107 99.792 0.226 - 1
108 109.116 0.226 - 1
109 77.596 0.1975 - 1
110 100.472 0.1975 - 1
111 114.912 0.226 - 1
112 98.648 0.1975 - 1
113 114.912 0.1975 - 1
114 101.08 0.1975 - 1
115 77.444 0.1975 - 1
116 80.484 0.1975 - 1
117 66.12 0.1975 - 1
118 117.04 0.1975 - 1
119 60.344 0.1975 - 1
120 88.464 0.1975 - 1
121 112.328 0.1975 - 1
122 114.684 0.1975 - 1
123 106.092 0.177 - 1
124 98.496 0.1975 - 1
125 109.82 0.1975 - 1
126 66.728 0.1975 - 1
127 83.16 0.226 - 1
128 78.052 0.1975 - 1
129 91.728 0.226 - 1
130 113.62 0.1975 - 1
131 91.656 0.1975 - 1
132 92.188 0.1975 - 1
133 66.576 0.1975 - 1
134 112.176 0.1975 - 1
135 116.356 0.1975 - 1
136 78.624 0.177 - 1
137 93.252 0.1975 - 1
138 76.076 0.1975 - 1
139 79.724 0.1975 - 1
140 105.336 0.177 - 1
141 79.192 0.1975 - 1
142 78.432 0.1975 - 1
143 91.124 0.1975 - 1
144 78.28 0.1975 - 1
145 65.208 0.1975 - 1
146 84.168 0.226 - 1
147 106.722 0.177 - 1
148 109.668 0.1975 - 1
149 106.552 0.1975 - 1
150 109.516 0.1975 - 1
151 107.16 0.1975 - 1
152 116.128 0.1975 - 1
153 74.48 0.1975 - 1
154 63.232 0.1975 - 1
155 85.044 0.1975 - 1
156 84.512 0.1975 - 1
157 84.664 0.1975 - 1
158 63.84 0.1975 - 1
159 60.496 0.1975 - 1
160 106.096 0.1975 - 1
161 109.06 0.1975 - 1
162 85.5 0.1975 - 1
163 84.892 0.1975 - 1
164 99.636 0.1975 - 1
165 86.032 0.1975 - 1
166 104.576 0.1975 - 1
167 90.744 0.1975 - 1
168 88.084 0.1975 - 1
169 88.236 0.1975 - 1
170 86.412 0.1975 - 1
171 105.108 0.1975 - 1
172 79.876 0.1975 - 1
173 104.196 0.1975 - 1
174 76.228 0.1975 - 1
175 101.232 0.1975 - 1
176 96.9 0.1975 - 1
177 87.02 0.1975 - 1
178 93.936 0.1975 - 1
179 115.976 0.1975 - 1
180 115.824 0.1975 - 1
181 48.412 0.1975 - 1
182 111.112 0.1975 - 1
183 90.592 0.1975 - 1
184 67.032 0.1975 - 1
185 116.052 0.1975 - 1
186 100.928 0.1975 - 1
187 68.552 0.1975 - 1
188 68.4 0.1975 - 1
189 66.88 0.1975 - 1
190 106.248 0.1975 - 1
191 259.056 0.177 - 1
192 260.148 0.1975 - 1
193 261.212 0.1975 - 1
194 261.06 0.1975 - 1
195 261.82 0.1975 - 1
196 261.972 0.1975 - 1
197 259.16 0.1975 - 1
198 260.82 0.177 - 1
199 259.008 0.1975 - 1
200 259.16 0.1975 - 1
201 262.276 0.1975 - 1
202 259.312 0.1975 - 1
203 259.464 0.1975 - 1
204 257.108 0.1975 - 1
205 259.616 0.1975 - 1
206 259.768 0.1975 - 1
207 259.92 0.1975 - 1
208 263.036 0.1975 - 1
209 264.632 0.1975 - 1
210 266.228 0.1975 - 1
211 266.076 0.1975 - 1
212 265.924 0.1975 - 1
213 265.772 0.1975 - 1
214 265.164 0.1975 - 1
215 263.188 0.1975 - 1
216 260.604 0.1975 - 1
217 263.34 0.1975 - 1
218 260.452 0.1975 - 1
219 260.072 0.1975 - 1
220 263.644 0.1975 - 1
221 260.908 0.1975 - 1
222 263.796 0.1975 - 1
223 260.756 0.1975 - 1
224 264.404 0.1975 - 1
225 262.124 0.1975 - 1
226 265.62 0.1975 - 1
227 265.316 0.1975 - 1
228 264.024 0.1975 - 1
229 264.252 0.1975 - 1
230 263.492 0.1975 - 1
231 264.784 0.1975 - 1
232 265.012 0.1975 - 1
233 260.224 0.1975 - 1
234 265.468 0.1975 - 1
235 241.224 0.1975 - 1
236 247.76 0.1975 - 1
237 241.376 0.1975 - 1
238 241.528 0.1975 - 1
239 243.58 0.1975 - 1
240 247.608 0.1975 - 1
241 241.68 0.1975 - 1
242 247.456 0.1975 - 1
243 60.648 0.1975 - 1
244 110.628 0.226 - 1
245 71.364 0.1975 - 1
246 102.676 0.1975 - 1
247 105.26 0.1975 - 1
248 106.974 0.177 - 1
249 104.728 0.1975 - 1
250 104.88 0.1975 - 1
251 107.226 0.177 - 1
252 97.508 0.1975 - 1
253 88.704 0.226 - 1
254 107.856 0.226 - 1
255 80.56 0.1975 - 1
256 113.088 0.1975 - 1
257 60.8 0.1975 - 1
258 78.28 0.1975 - 1
259 86.184 0.1975 - 1
260 100.624 0.1975 - 1
261 88.2 0.177 - 1
262 78.736 0.1975 - 1
263 108.832 0.1975 - 1
264 104.424 0.1975 - 1
265 94.696 0.1975 - 1
266 79.04 0.1975 - 1
267 88.452 0.177 - 1
268 98.344 0.1975 - 1
269 88.16 0.1975 - 1
270 112.556 0.1975 - 1
271 80.18 0.1975 - 1
272 63.688 0.1975 - 1
273 78.888 0.1975 - 1
274 114.66 0.177 - 1
275 108.528 0.1975 - 1
276 88.312 0.1975 - 1
277 89.208 0.226 - 1
278 112.404 0.1975 - 1
279 64.372 0.1975 - 1
280 104.044 0.1975 - 1
281 77.824 0.1975 - 1
282 107.236 0.1975 - 1
283 85.12 0.1975 - 1
284 76.38 0.1975 - 1
285 93.556 0.1975 - 1
286 92.34 0.1975 - 1
287 254.904 0.1975 - 1
288 256.576 0.1975 - 1
289 67.944 0.1975 - 1
290 86.64 0.1975 - 1
291 90.72 0.226 - 1
292 89.908 0.1975 - 1
293 89.376 0.1975 - 1
294 92.72 0.1975 - 1
295 103.436 0.1975 - 1
296 92.036 0.1975 - 1
297 89.082 0.177 - 1
298 80.788 0.1975 - 1
299 86.336 0.1975 - 1
300 60.952 0.1975 - 1
301 103.892 0.1975 - 1
302 80.94 0.1975 - 1
303 88.616 0.1975 - 1
304 86.564 0.1975 - 1
305 90.896 0.1975 - 1
306 79.724 0.1975 - 1
307 81.244 0.1975 - 1
308 66.576 0.1975 - 1
309 110.96 0.1975 - 1
310 88.768 0.1975 - 1
311 81.092 0.1975 - 1
312 63 0.226 - 1
313 79.268 0.1975 - 1
314 81.396 0.1975 - 1
315 87.02 0.1975 - 1
316 80.18 0.1975 - 1
317 102.828 0.1975 - 1
318 91.124 0.1975 - 1
319 64.752 0.1975 - 1
320 88.704 0.177 - 1
321 63 0.177 - 1
322 106.932 0.1975 - 1
323 108.36 0.226 - 1
324 88.92 0.1975 - 1
325 108.224 0.1975 - 1
326 72.808 0.1975 - 1
327 81.624 0.1975 - 1
328 97.964 0.1975 - 1
329 91.884 0.1975 - 1
330 87.172 0.1975 - 1
331 119.624 0.1975 - 1
332 94.924 0.1975 - 1
333 89.072 0.1975 - 1
334 66.424 0.1975 - 1
335 110.124 0.226 - 1
336 97.902 0.177 - 1
337 99.18 0.1975 - 1
338 87.476 0.1975 - 1
339 93.784 0.1975 - 1
340 115.748 0.1975 - 1
341 81.776 0.1975 - 1
342 91.884 0.1975 - 1
343 76.532 0.1975 - 1
344 93.784 0.1975 - 1
345 111.132 0.226 - 1
346 89.224 0.1975 - 1
347 79.128 0.177 - 1
348 80.332 0.1975 - 1
349 68.248 0.1975 - 1
350 87.628 0.1975 - 1
351 85.348 0.1975 - 1
352 103.284 0.1975 - 1
353 96.596 0.1975 - 1
354 78.584 0.1975 - 1
355 87.948 0.226 - 1
356 87.78 0.1975 - 1
357 95.76 0.1975 - 1
358 107.844 0.1975 - 1
359 107.692 0.1975 - 1
360 85.652 0.1975 - 1
361 82.656 0.226 - 1
362 90.44 0.1975 - 1
363 93.24 0.226 - 1
364 48.716 0.1975 - 1
365 242.972 0.1975 - 1
366 243.124 0.1975 - 1
367 242.516 0.1975 - 1
368 243.428 0.1975 - 1
369 242.668 0.1975 - 1
370 242.82 0.1975 - 1
371 245.86 0.1975 - 1
372 248.824 0.1975 - 1
373 242.364 0.1975 - 1
374 243.276 0.1975 - 1
375 249.28 0.1975 - 1
376 245.176 0.1975 - 1
377 245.024 0.1975 - 1
378 245.328 0.1975 - 1
379 244.796 0.1975 - 1
380 244.644 0.1975 - 1
381 248.216 0.1975 - 1
382 240.616 0.1975 - 1
383 241.072 0.1975 - 1
384 248.368 0.1975 - 1
385 248.52 0.1975 - 1
386 240.464 0.1975 - 1
387 240.768 0.1975 - 1
388 240.92 0.1975 - 1
389 242.212 0.1975 - 1
390 240.008 0.1975 - 1
391 250.192 0.1975 - 1
392 240.16 0.1975 - 1
393 250.344 0.1975 - 1
394 241.908 0.1975 - 1
395 248.064 0.1975 - 1
396 247.912 0.1975 - 1
397 246.848 0.1975 - 1
398 247.304 0.1975 - 1
399 249.128 0.1975 - 1
400 247 0.1975 - 1
401 246.696 0.1975 - 1
402 245.708 0.1975 - 1
403 245.48 0.1975 - 1
404 244.492 0.1975 - 1
405 246.164 0.1975 - 1
406 246.012 0.1975 - 1
407 244.34 0.1975 - 1
408 247.152 0.1975 - 1
409 248.976 0.1975 - 1
410 246.316 0.1975 - 1
411 246.468 0.1975 - 1
412 244.188 0.1975 - 1
413 248.672 0.1975 - 1
414 250.648 0.1975 - 1
415 239.704 0.1975 - 1
416 250.496 0.1975 - 1
417 250.8 0.1975 - 1
418 239.856 0.1975 - 1
419 250.04 0.1975 - 1
420 242.06 0.1975 - 1
421 240.312 0.1975 - 1
422 243.732 0.1975 - 1
423 249.432 0.1975 - 1
424 243.884 0.1975 - 1
425 249.584 0.1975 - 1
426 244.036 0.1975 - 1
427 249.736 0.1975 - 1
428 249.888 0.1975 - 1
429 49.248 0.1975 - 1
430 49.552 0.1975 - 1
431 252.548 0.1975 - 1
432 49.856 0.1975 - 1
433 50.16 0.1975 - 1
434 50.692 0.1975 - 1
435 50.996 0.1975 - 1
436 51.3 0.1975 - 1
437 51.604 0.1975 - 1
438 52.136 0.1975 - 1
439 52.44 0.1975 - 1
440 52.744 0.1975 - 1
441 53.048 0.1975 - 1
442 53.58 0.1975 - 1
443 89.376 0.1975 - 1
444 252.396 0.1975 - 1
445 53.884 0.1975 - 1
446 54.188 0.1975 - 1
447 54.492 0.1975 - 1
448 54.644 0.1975 - 1
449 54.34 0.1975 - 1
450 54.036 0.1975 - 1
451 53.732 0.1975 - 1
452 53.428 0.1975 - 1
453 53.2 0.1975 - 1
454 52.896 0.1975 - 1
455 52.592 0.1975 - 1
456 52.288 0.1975 - 1
457 51.984 0.1975 - 1
458 103.132 0.1975 - 1
459 51.756 0.1975 - 1
460 89.68 0.1975 - 1
461 84.284 0.1975 - 1
462 90.288 0.1975 - 1
463 81.092 0.1975 - 1
464 115.9 0.1975 - 1
465 92.872 0.1975 - 1
466 82.46 0.1975 - 1
467 98.192 0.1975 - 1
468 112.024 0.1975 - 1
469 89.072 0.1975 - 1
470 105.588 0.177 - 1
471 87.948 0.177 - 1
472 115.292 0.1975 - 1
473 106.344 0.177 - 1
474 100.296 0.177 - 1
475 111.568 0.1975 - 1
476 113.24 0.1975 - 1
477 107.312 0.1975 - 1
478 107.844 0.1975 - 1
479 107.616 0.1975 - 1
480 114.532 0.1975 - 1
481 79.38 0.177 - 1
482 92.736 0.177 - 1
483 112.784 0.1975 - 1
484 114.408 0.177 - 1
485 107.996 0.1975 - 1
486 105.944 0.1975 - 1
487 108.756 0.1975 - 1
488 112.632 0.1975 - 1
489 88.616 0.1975 - 1
490 111.872 0.1975 - 1
491 104.58 0.177 - 1
492 95.76 0.177 - 1
493 112.644 0.177 - 1
494 114.156 0.177 - 1
495 112.392 0.177 - 1
496 99.792 0.177 - 1
497 112.48 0.1975 - 1
498 92.232 0.177 - 1
499 110.2 0.1975 - 1
500 100.044 0.177 - 1
501 93.024 0.1975 - 1
502 102.524 0.1975 - 1
503 102.22 0.1975 - 1
504 78.736 0.1975 - 1
505 102.372 0.1975 - 1
506 99.788 0.1975 - 1
507 91.602 0.177 - 1
508 86.436 0.177 - 1
509 109.364 0.1975 - 1
510 112.14 0.177 - 1
511 87.696 0.177 - 1
512 113.088 0.1975 - 1
513 111.888 0.177 - 1
514 110.808 0.1975 - 1
515 85.804 0.1975 - 1
516 67.792 0.1975 - 1
517 109.972 0.1975 - 1
518 103.572 0.177 - 1
519 91.352 0.1975 - 1
520 82.232 0.1975 - 1
521 85.68 0.177 - 1
522 79.632 0.177 - 1
523 83.98 0.1975 - 1
524 100.244 0.1975 - 1
525 79.04 0.1975 - 1
526 87.324 0.1975 - 1
527 92.492 0.1975 - 1
528 79.42 0.1975 - 1
529 86.716 0.1975 - 1
530 101.916 0.1975 - 1
531 115.444 0.1975 - 1
532 78.888 0.1975 - 1
533 110.352 0.1975 - 1
534 83.676 0.1975 - 1
535 62.496 0.226 - 1
536 90.972 0.1975 - 1
537 89.908 0.1975 - 1
538 75.772 0.1975 - 1
539 108.148 0.1975 - 1
540 86.688 0.177 - 1
541 83.524 0.1975 - 1
542 82.46 0.1975 - 1
543 83.372 0.1975 - 1
544 108.984 0.1975 - 1
545 108.528 0.1975 - 1
546 90.06 0.1975 - 1
547 82.612 0.1975 - 1
548 82.764 0.1975 - 1
549 82.992 0.1975 - 1
550 87.444 0.177 - 1
551 91.504 0.1975 - 1
552 61.236 0.177 - 1
553 81.32 0.1975 - 1
554 99.94 0.1975 - 1
555 102.98 0.1975 - 1
556 108.3 0.1975 - 1
557 79.572 0.1975 - 1
558 86.26 0.1975 - 1
559 64.524 0.1975 - 1
560 89.528 0.1975 - 1
561 88.768 0.1975 - 1
562 101.556 0.177 - 1
563 64.296 0.1975 - 1
564 78.128 0.1975 - 1
565 75.62 0.1975 - 1
566 101.808 0.177 - 1
567 90.09 0.177 - 1
568 87.192 0.177 - 1
569 113.904 0.177 - 1
570 90.342 0.177 - 1
571 61.104 0.1975 - 1
572 61.74 0.177 - 1
573 86.868 0.1975 - 1
574 110.656 0.1975 - 1
575 84.294 0.177 - 1
576 113.652 0.177 - 1
577 98.784 0.177 - 1
578 113.848 0.1975 - 1
579 102.816 0.226 - 1
580 99.332 0.1975 - 1
581 108.36 0.177 - 1
582 112.936 0.1975 - 1
583 108.108 0.177 - 1
584 102.816 0.177 - 1
585 107.464 0.1975 - 1
586 114.38 0.1975 - 1
587 97.052 0.1975 - 1
588 111.72 0.1975 - 1
589 98.154 0.177 - 1
590 102.828 0.1975 - 1
591 108.864 0.177 - 1
592 102.144 0.1975 - 1
593 109.116 0.177 - 1
594 98.344 0.1975 - 1
595 104.88 0.1975 - 1
596 111.796 0.1975 - 1
597 104.328 0.177 - 1
598 97.146 0.177 - 1
599 109.62 0.226 - 1
600 102.312 0.226 - 1
601 110.88 0.177 - 1
602 103.32 0.226 - 1
603 110.732 0.1975 - 1
604 96.642 0.177 - 1
605 110.352 0.1975 - 1
606 104.076 0.177 - 1
607 100.244 0.1975 - 1
608 98.496 0.1975 - 1
609 106.02 0.1975 - 1
610 106.476 0.1975 - 1
611 109.972 0.1975 - 1
612 106.172 0.1975 - 1
613 109.592 0.1975 - 1
614 85.428 0.177 - 1
615 111.416 0.1975 - 1
616 113.4 0.177 - 1
617 90.216 0.226 - 1
618 114.228 0.1975 - 1
619 111.416 0.1975 - 1
620 111.264 0.1975 - 1
621 101.992 0.1975 - 1
622 67.412 0.1975 - 1
623 86.94 0.177 - 1
624 104.958 0.177 - 1
625 102.676 0.1975 - 1
626 86.868 0.1975 - 1
627 91.732 0.1975 - 1
628 87.324 0.1975 - 1
629 82.764 0.1975 - 1
630 96.672 0.1975 - 1
631 102.06 0.177 - 1
632 87.856 0.1975 - 1
633 90.72 0.177 - 1
634 82.916 0.1975 - 1
635 93.632 0.1975 - 1
636 83.068 0.1975 - 1
637 100.624 0.1975 - 1
638 61.256 0.1975 - 1
639 81.624 0.1975 - 1
640 102.296 0.1975 - 1
641 102.564 0.177 - 1
642 102.448 0.1975 - 1
643 100.472 0.1975 - 1
644 79.876 0.1975 - 1
645 102.312 0.177 - 1
646 93.936 0.1975 - 1
647 79.572 0.1975 - 1
648 94.088 0.1975 - 1
649 83.22 0.1975 - 1
650 99.408 0.1975 - 1
651 84.056 0.1975 - 1
652 92.796 0.1975 - 1
653 94.24 0.1975 - 1
654 98.876 0.1975 - 1
655 93.328 0.1975 - 1
656 104.728 0.1975 - 1
657 93.24 0.177 - 1
658 64.22 0.1975 - 1
659 61.408 0.1975 - 1
660 98.192 0.1975 - 1
661 99.256 0.1975 - 1
662 100.092 0.1975 - 1
663 79.42 0.1975 - 1
664 99.288 0.177 - 1
665 99.94 0.1975 - 1
666 99.104 0.1975 - 1
667 88.464 0.1975 - 1
668 99.788 0.1975 - 1
669 109.136 0.1975 - 1
670 80.408 0.1975 - 1
671 81.776 0.1975 - 1
672 74.176 0.1975 - 1
673 107.352 0.226 - 1
674 116.046 0.177 - 1
675 115.52 0.1975 - 1
676 117.648 0.1975 - 1
677 119.016 0.1975 - 1
678 118.864 0.1975 - 1
679 115.368 0.1975 - 1
680 115.216 0.1975 - 1
681 115.672 0.1975 - 1
682 115.064 0.1975 - 1
683 115.416 0.226 - 1
684 116.66 0.1975 - 1
685 117.496 0.1975 - 1
686 116.508 0.1975 - 1
687 116.204 0.1975 - 1
688 115.14 0.1975 - 1
689 125.628 0.1975 - 1
690 117.344 0.1975 - 1
691 125.476 0.1975 - 1
692 119.168 0.1975 - 1
693 117.192 0.1975 - 1
694 96.264 0.226 - 1
695 97.66 0.1975 - 1
696 99.288 0.226 - 1
697 116.888 0.1975 - 1
698 80.64 0.226 - 1
699 97.272 0.226 - 1
700 96.768 0.226 - 1
701 80.388 0.177 - 1
702 81.144 0.226 - 1
703 83.412 0.177 - 1
704 80.892 0.177 - 1
705 81.144 0.177 - 1
706 81.396 0.177 - 1
707 80.136 0.177 - 1
708 82.404 0.177 - 1
709 71.668 0.1975 - 1
710 72.124 0.1975 - 1
711 65.394 0.177 - 1
712 64.89 0.177 - 1
713 65.646 0.177 - 1
714 65.898 0.177 - 1
715 67.032 0.177 - 1
716 66.15 0.177 - 1
717 71.972 0.1975 - 1
718 72.656 0.1975 - 1
719 67.41 0.177 - 1
720 71.82 0.1975 - 1
721 74.328 0.1975 - 1
722 74.176 0.1975 - 1
723 73.568 0.1975 - 1
724 72.884 0.1975 - 1
725 77.238 0.177 - 1
726 77.49 0.177 - 1
727 75.24 0.1975 - 1
728 76.734 0.177 - 1
729 78.876 0.177 - 1
730 78.12 0.177 - 1
731 76.986 0.177 - 1
732 75.468 0.1975 - 1
733 77.868 0.177 - 1
734 80.64 0.177 - 1
735 76.228 0.1975 - 1
736 79.884 0.177 - 1
737 107.388 0.1975 - 1
738 107.54 0.1975 - 1
739 84.588 0.1975 - 1
740 94.62 0.1975 - 1
741 90.06 0.1975 - 1
742 82.612 0.1975 - 1
743 96.368 0.1975 - 1
744 94.772 0.1975 - 1
745 90.44 0.1975 - 1
746 77.976 0.1975 - 1
747 80.028 0.1975 - 1
748 58.216 0.1975 - 1
749 112.86 0.1975 - 1
750 59.28 0.1975 - 1
751 112.708 0.1975 - 1
752 112.1 0.1975 - 1
753 59.432 0.1975 - 1
754 110.884 0.1975 - 1
755 59.584 0.1975 - 1
756 58.976 0.1975 - 1
757 105.184 0.1975 - 1
758 69.54 0.1975 - 1
759 105.716 0.1975 - 1
760 105.868 0.1975 - 1
761 108.68 0.1975 - 1
762 59.128 0.1975 - 1
763 106.324 0.1975 - 1
764 100.928 0.1975 - 1
765 69.844 0.1975 - 1
766 101.384 0.1975 - 1
767 101.08 0.1975 - 1
768 101.232 0.1975 - 1
769 100.776 0.1975 - 1
770 58.52 0.1975 - 1
771 58.824 0.1975 - 1
772 70.68 0.1975 - 1
773 68.932 0.1975 - 1
774 77.52 0.1975 - 1
775 68.78 0.1975 - 1
776 77.368 0.1975 - 1
777 59.736 0.1975 - 1
778 60.04 0.1975 - 1
779 69.084 0.1975 - 1
780 56.848 0.1975 - 1
781 56.696 0.1975 - 1
782 57 0.1975 - 1
783 57.152 0.1975 - 1
784 56.24 0.1975 - 1
785 55.632 0.1975 - 1
786 55.48 0.1975 - 1
787 55.784 0.1975 - 1
788 57.912 0.1975 - 1
789 55.936 0.1975 - 1
790 56.088 0.1975 - 1
791 56.392 0.1975 - 1
792 58.672 0.1975 - 1
793 57.456 0.1975 - 1
794 57.304 0.1975 - 1
795 73.72 0.1975 - 1
796 57.608 0.1975 - 1
797 58.064 0.1975 - 1
798 56.544 0.1975 - 1
799 57.76 0.1975 - 1
800 78.432 0.1975 - 1
801 76.684 0.1975 - 1
802 76.836 0.1975 - 1
803 76.988 0.1975 - 1
804 84.36 0.1975 - 1
805 88.008 0.1975 - 1
806 55.024 0.1975 - 1
807 90.212 0.1975 - 1
808 54.872 0.1975 - 1
809 55.328 0.1975 - 1
810 87.172 0.1975 - 1
811 55.176 0.1975 - 1
812 51.452 0.1975 - 1
813 51.148 0.1975 - 1
814 74.708 0.1975 - 1
815 50.844 0.1975 - 1
816 50.54 0.1975 - 1
817 50.312 0.1975 - 1
818 50.008 0.1975 - 1
819 49.704 0.1975 - 1
820 49.4 0.1975 - 1
821 49.096 0.1975 - 1
822 48.868 0.1975 - 1
823 48.564 0.1975 - 1
824 48.26 0.1975 - 1
825 47.956 0.1975 - 1
826 73.34 0.1975 - 1
827 77.672 0.1975 - 1
828 47.652 0.1975 - 1
829 47.424 0.1975 - 1
830 47.12 0.1975 - 1
831 46.816 0.1975 - 1
832 46.512 0.1975 - 1
833 46.208 0.1975 - 1
834 45.98 0.1975 - 1
835 45.676 0.1975 - 1
836 45.372 0.1975 - 1
837 45.068 0.1975 - 1
838 44.764 0.1975 - 1
839 44.536 0.1975 - 1
840 44.232 0.1975 - 1
841 77.14 0.1975 - 1
842 78.584 0.1975 - 1
843 100.8 0.177 - 1
844 98.952 0.1975 - 1
845 66.272 0.1975 - 1
846 101.052 0.177 - 1
847 101.304 0.177 - 1
848 113.148 0.177 - 1
849 96.064 0.1975 - 1
850 96.39 0.177 - 1
851 84.208 0.1975 - 1
852 70.528 0.1975 - 1
853 118.56 0.1975 - 1
854 85.272 0.1975 - 1
855 118.712 0.1975 - 1
856 95.004 0.177 - 1
857 120.232 0.1975 - 1
858 95.532 0.1975 - 1
859 96.824 0.1975 - 1
860 121.676 0.1975 - 1
861 95.456 0.1975 - 1
862 125.78 0.1975 - 1
863 124.336 0.1975 - 1
864 114.38 0.1975 - 1
865 94.752 0.177 - 1
866 70.376 0.1975 - 1
867 69.692 0.1975 - 1
868 111.636 0.177 - 1
869 84.74 0.1975 - 1
870 100.548 0.177 - 1
871 92.34 0.1975 - 1
872 103.824 0.177 - 1
873 99.54 0.177 - 1
874 89.334 0.177 - 1
875 114 0.1975 - 1
876 100.092 0.1975 - 1
877 84.798 0.177 - 1
878 82.004 0.1975 - 1
879 97.736 0.1975 - 1
880 113.468 0.1975 - 1
881 110.504 0.1975 - 1
882 110.628 0.177 - 1
883 106.4 0.1975 - 1
884 111.384 0.177 - 1
885 115.596 0.1975 - 1
886 94.374 0.177 - 1
887 105.792 0.1975 - 1
888 112.252 0.1975 - 1
889 108.612 0.177 - 1
890 114.988 0.1975 - 1
891 107.478 0.177 - 1
892 100.776 0.1975 - 1
893 114.836 0.1975 - 1
894 111.132 0.177 - 1
895 105.412 0.1975 - 1
896 102.98 0.1975 - 1
897 103.284 0.1975 - 1
898 85.424 0.1975 - 1
899 106.78 0.1975 - 1
900 95 0.1975 - 1
901 103.512 0.1975 - 1
902 105.032 0.1975 - 1
903 58.368 0.1975 - 1
904 105.564 0.1975 - 1
905 113.468 0.1975 - 1
906 111.948 0.1975 - 1
907 87.704 0.1975 - 1
908 65.36 0.1975 - 1
909 104.576 0.1975 - 1
910 62.016 0.1975 - 1
911 66.728 0.1975 - 1
912 84.968 0.1975 - 1
913 95.608 0.1975 - 1
914 97.888 0.1975 - 1
915 90.592 0.1975 - 1
916 61.864 0.1975 - 1
917 105.588 0.226 - 1
918 104.12 0.1975 - 1
919 98.648 0.1975 - 1
920 106.628 0.1975 - 1
921 97.204 0.1975 - 1
922 68.096 0.1975 - 1
923 110.504 0.1975 - 1
924 110.124 0.1975 - 1
925 96.976 0.1975 - 1
926 104.272 0.1975 - 1
927 91.58 0.1975 - 1
928 103.816 0.1975 - 1
929 83.828 0.1975 - 1
930 89.224 0.1975 - 1
931 97.508 0.1975 - 1
932 62.168 0.1975 - 1
933 104.424 0.1975 - 1
934 66.196 0.1975 - 1
935 103.968 0.1975 - 1
936 86.488 0.1975 - 1
937 92.948 0.1975 - 1
938 95.836 0.1975 - 1
939 97.356 0.1975 - 1
940 91.098 0.177 - 1
941 91.428 0.1975 - 1
942 94.392 0.1975 - 1
943 91.276 0.1975 - 1
944 69.236 0.1975 - 1
945 111.036 0.1975 - 1
946 67.64 0.1975 - 1
947 64.6 0.1975 - 1
948 65.284 0.1975 - 1
949 110.376 0.177 - 1
950 105.564 0.1975 - 1
951 65.512 0.1975 - 1
952 103.068 0.177 - 1
953 103.32 0.177 - 1
954 110.124 0.177 - 1
955 105.412 0.1975 - 1
956 96.368 0.1975 - 1
957 59.888 0.1975 - 1
958 91.35 0.177 - 1
959 95.228 0.1975 - 1
960 97.28 0.1975 - 1
961 94.088 0.1975 - 1
962 119.776 0.1975 - 1
963 96.216 0.1975 - 1
964 124.184 0.1975 - 1
965 124.032 0.1975 - 1
966 95.076 0.1975 - 1
967 123.88 0.1975 - 1
968 94.24 0.1975 - 1
969 96.748 0.1975 - 1
970 97.812 0.1975 - 1
971 119.928 0.1975 - 1
972 95.912 0.1975 - 1
973 93.404 0.1975 - 1
974 123.272 0.1975 - 1
975 120.536 0.1975 - 1
976 123.576 0.1975 - 1
977 123.728 0.1975 - 1
978 123.424 0.1975 - 1
979 69.388 0.1975 - 1
980 120.384 0.1975 - 1
981 119.472 0.1975 - 1
982 120.08 0.1975 - 1
983 120.764 0.1975 - 1
984 120.916 0.1975 - 1
985 114.228 0.1975 - 1
986 119.32 0.1975 - 1
987 117.8 0.1975 - 1
988 117.952 0.1975 - 1
989 118.256 0.1975 - 1
990 118.104 0.1975 - 1
991 107.084 0.1975 - 1
992 70.224 0.1975 - 1
993 118.408 0.1975 - 1
994 106.932 0.1975 - 1
995 85.728 0.1975 - 1
996 114.684 0.1975 - 1
997 113.772 0.1975 - 1
998 114.076 0.1975 - 1
999 114.532 0.1975 - 1
1000 113.924 0.1975 - 1
1001 97.65 0.177 - 1
1002 95.988 0.1975 - 1
1003 95.256 0.177 - 1
1004 95.228 0.1975 - 1
1005 109.872 0.177 - 1
1006 103.664 0.1975 - 1
1007 95.508 0.177 - 1
1008 91.98 0.177 - 1
1009 107.996 0.1975 - 1
1010 96.216 0.1975 - 1
1011 109.62 0.177 - 1
1012 87.476 0.1975 - 1
1013 109.364 0.1975 - 1
1014 99.56 0.1975 - 1
1015 83.372 0.1975 - 1
1016 83.904 0.1975 - 1
1017 109.368 0.177 - 1
1018 83.6 0.1975 - 1
1019 64.068 0.1975 - 1
1020 63.384 0.1975 - 1
1021 92.644 0.1975 - 1
1022 103.74 0.1975 - 1
1023 93.1 0.1975 - 1
1024 66.88 0.1975 - 1
1025 63.004 0.1975 - 1
1026 92.036 0.1975 - 1
1027 90.744 0.1975 - 1
1028 103.588 0.1975 - 1
1029 98.04 0.1975 - 1
1030 99.036 0.177 - 1
1031 82.232 0.1975 - 1
1032 62.7 0.1975 - 1
1033 101.612 0.1975 - 1
1034 63.504 0.226 - 1
1035 89.604 0.1975 - 1
1036 102.068 0.1975 - 1
1037 101.46 0.1975 - 1
1038 62.548 0.1975 - 1
1039 101.764 0.1975 - 1
1040 62.852 0.1975 - 1
1041 92.188 0.1975 - 1
1042 83.752 0.1975 - 1
1043 93.48 0.1975 - 1
1044 89.756 0.1975 - 1
1045 101.536 0.1975 - 1
1046 103.132 0.1975 - 1
1047 89.586 0.177 - 1
1048 86.032 0.1975 - 1
1049 92.492 0.1975 - 1
1050 89.838 0.177 - 1
1051 65.968 0.1975 - 1
1052 62.32 0.1975 - 1
1053 65.664 0.1975 - 1
1054 63.504 0.177 - 1
1055 62.748 0.177 - 1
1056 112.14 0.226 - 1
1057 115.794 0.177 - 1
1058 112.896 0.177 - 1
1059 115.542 0.177 - 1
1060 112.896 0.226 - 1
1061 115.29 0.177 - 1
1062 106.848 0.226 - 1
1063 115.038 0.177 - 1
1064 111.636 0.226 - 1
1065 104.58 0.226 - 1
1066 105.084 0.226 - 1
1067 106.092 0.226 - 1
1068 100.296 0.226 - 1
1069 101.808 0.226 - 1
1070 74.328 0.1975 - 1
1071 100.8 0.226 - 1
1072 75.088 0.1975 - 1
1073 73.872 0.1975 - 1
1074 101.304 0.226 - 1
1075 74.844 0.226 - 1
1076 74.718 0.177 - 1
1077 98.8 0.1975 - 1
1078 62.37 0.177 - 1
1079 61.488 0.226 - 1
1080 61.992 0.226 - 1
1081 61.992 0.177 - 1
1082 61.488 0.177 - 1
1083 61.256 0.1975 - 1
1084 61.56 0.1975 - 1
1085 61.712 0.1975 - 1
1086 61.636 0.1975 - 1
1087 61.864 0.1975 - 1
1088 63.252 0.177 - 1
1089 62.168 0.1975 - 1
1090 66.044 0.1975 - 1
1091 62.016 0.1975 - 1
1092 62.548 0.1975 - 1
1093 67.336 0.1975 - 1
1094 65.892 0.1975 - 1
1095 62.396 0.1975 - 1
1096 61.408 0.1975 - 1
1097 64.828 0.1975 - 1
1098 65.142 0.177 - 1
1099 65.74 0.1975 - 1
1100 65.588 0.1975 - 1
1101 65.436 0.1975 - 1
1102 64.676 0.1975 - 1
1103 64.144 0.1975 - 1
1104 62.7 0.1975 - 1
1105 65.056 0.1975 - 1
1106 62.852 0.1975 - 1
1107 63.46 0.1975 - 1
1108 63.308 0.1975 - 1
1109 63.156 0.1975 - 1
1110 63.764 0.1975 - 1
1111 67.184 0.1975 - 1
1112 74.936 0.1975 - 1
1113 67.032 0.1975 - 1
1114 74.024 0.1975 - 1
1115 70.832 0.1975 - 1
1116 74.708 0.1975 - 1
1117 96.52 0.1975 - 1
1118 123.12 0.1975 - 1
1119 125.324 0.1975 - 1
1120 125.172 0.1975 - 1
1121 125.02 0.1975 - 1
1122 124.868 0.1975 - 1
1123 124.716 0.1975 - 1
1124 122.968 0.1975 - 1
1125 122.816 0.1975 - 1
1126 122.664 0.1975 - 1
1127 124.564 0.1975 - 1
1128 101.764 0.1975 - 1
1129 63.004 0.1975 - 1
1130 65.816 0.1975 - 1
1131 91.224 0.226 - 1
1132 84.546 0.177 - 1
1133 83.664 0.226 - 1
1134 86.436 0.226 - 1
1135 82.656 0.177 - 1
1136 92.232 0.226 - 1
1137 82.908 0.177 - 1
1138 98.406 0.177 - 1
1139 95.38 0.1975 - 1
1140 97.398 0.177 - 1
1141 94.752 0.226 - 1
1142 95.76 0.226 - 1
1143 95.256 0.226 - 1
1144 94.248 0.226 - 1
1145 98.784 0.226 - 1
1146 96.894 0.177 - 1
1147 87.444 0.226 - 1
1148 86.94 0.226 - 1
1149 81.648 0.226 - 1
1150 82.152 0.226 - 1
1151 83.16 0.177 - 1
1152 83.79 0.177 - 1
1153 80.636 0.1975 - 1
1154 80.94 0.1975 - 1
1155 81.928 0.1975 - 1
1156 81.472 0.1975 - 1
1157 80.788 0.1975 - 1
1158 82.08 0.1975 - 1
1159 81.648 0.177 - 1
1160 81.9 0.177 - 1
1161 82.152 0.177 - 1
1162 83.22 0.1975 - 1
1163 84.132 0.1975 - 1
1164 84.042 0.177 - 1
1165 86.058 0.177 - 1
1166 85.05 0.177 - 1
1167 92.736 0.226 - 1
1168 73.492 0.1975 - 1
1169 94.392 0.1975 - 1
1170 94.544 0.1975 - 1
1171 76.532 0.1975 - 1
1172 72.96 0.1975 - 1
1173 71.516 0.1975 - 1
1174 71.668 0.1975 - 1
1175 76.38 0.1975 - 1
1176 71.82 0.1975 - 1
1177 71.972 0.1975 - 1
1178 76.076 0.1975 - 1
1179 93.492 0.177 - 1
1180 94.122 0.177 - 1
1181 93.744 0.226 - 1
1182 98.028 0.226 - 1
1183 96.012 0.177 - 1
1184 92.484 0.177 - 1
1185 93.744 0.177 - 1
1186 92.988 0.177 - 1
1187 72.124 0.1975 - 1
1188 69.996 0.1975 - 1
1189 71.136 0.1975 - 1
1190 70.984 0.1975 - 1
1191 72.58 0.1975 - 1
1192 72.276 0.1975 - 1
1193 73.112 0.1975 - 1
1194 72.428 0.1975 - 1
1195 43.928 0.1975 - 1
1196 43.624 0.1975 - 1
1197 63.612 0.1975 - 1
1198 43.32 0.1975 - 1
1199 43.092 0.1975 - 1
1200 42.788 0.1975 - 1
1201 42.484 0.1975 - 1
1202 42.18 0.1975 - 1
1203 41.876 0.1975 - 1
1204 41.572 0.1975 - 1
1205 41.344 0.1975 - 1
1206 41.04 0.1975 - 1
1207 40.736 0.1975 - 1
1208 40.432 0.1975 - 1
1209 67.792 0.1975 - 1
1210 67.184 0.1975 - 1
1211 40.128 0.1975 - 1
1212 39.9 0.1975 - 1
1213 39.596 0.1975 - 1
1214 39.292 0.1975 - 1
1215 38.988 0.1975 - 1
1216 38.684 0.1975 - 1
1217 38.456 0.1975 - 1
1218 38.152 0.1975 - 1
1219 37.848 0.1975 - 1
1220 37.544 0.1975 - 1
1221 37.24 0.1975 - 1
1222 37.012 0.1975 - 1
1223 36.708 0.1975 - 1
1224 63.992 0.1975 - 1
1225 64.98 0.1975 - 1
1226 178.752 0.1975 - 1
1227 176.244 0.1975 - 1
1228 177.46 0.1975 - 1
1229 175.408 0.1975 - 1
1230 176.396 0.1975 - 1
13201 312.56 86.67 N 0
13202 311.427 48.15 N 0
13203 312.446 28.89 N 0
13204 316.315 279.27 N 0
13205 339.102 202.23 N 0
13206 275.824 242.801 N 0
13207 283.204 164.783 N 0
13208 334.681 260.01 N 0
13209 341.914 182.97 N 0
13210 246.176 261.084 N 0
13211 280.392 184.043 N 0
13212 313.296 67.41 N 0
13213 341.914 96.3945 N 0
13214 341.914 25.804 N 0
13215 305.18 260.01 N 0
13216 306.276 145.523 N 0
13217 275.53 262.061 N 0
13218 276.002 89.6095 N 0
13219 304.886 223.541 N 0
13220 338.293 163.71 N 0
13221 245.947 241.824 N 0
13222 255.343 126.263 N 0
13223 340.845 115.655 N 0
13224 341.801 45.064 N 0
13225 312.387 9.63 N 0
13226 339.102 221.49 N 0
13227 308.938 125.19 N 0
13228 280.392 203.303 N 0
13229 311.121 105.93 N 0
13230 334.435 240.75 N 0
13231 336.435 144.45 N 0
13232 251.037 203.303 N 0
13233 263.221 145.523 N 0
13234 341.94 80.429 N 0
13235 342.005 61.334 N 0
13236 341.75 8.8835 N 0
13237 310.058 221.211 N 0
13238 310.892 163.978 N 0
13239 275.16 222.564 N 0
13240 251.037 184.043 N 0
13241 309.746 202.23 N 0
13242 312.56 182.97 N 0
13243 245.796 222.564 N 0
13244 253.85 164.783 N 0
13245 74.907 260.01 N 0
13246 133.617 199.473 N 0
13247 132.098 59.588 N 0
13248 102.743 131.443 N 0
13249 141.417 263.497 N 0
13250 132.965 177.525 N 0
13251 179.206 12.269 N 0
13252 102.743 112.183 N 0
13253 162.972 218.125 N 0
13254 179.669 100.485 N 0
13255 162.972 198.865 N 0
13256 16.1975 240.75 N 0
13257 16.1975 221.49 N 0
13258 32.4305 9.63 N 0
13259 14.6775 144.449 N 0
13260 112.061 279.27 N 0
13261 107.075 150.704 N 0
13262 73.3875 48.15 N 0
13263 44.0325 86.67 N 0
13264 141.417 244.237 N 0
13265 161.452 139.005 N 0
13266 162.972 179.605 N 0
13267 53.3515 298.53 N 0
13268 74.907 221.49 N 0
13269 91.1405 9.63 N 0
13270 73.3875 105.93 N 0
13271 112.061 235.806 N 0
13272 136.43 158.265 N 0
13273 122.926 35.1435 N 0
13274 103.454 92.9235 N 0
13275 184.513 256.645 N 0
13276 190.807 121.825 N 0
13277 192.327 179.605 N 0
13278 45.552 240.75 N 0
13279 77.7195 150.704 N 0
13280 149.85 15.8835 N 0
13281 102.743 73.664 N 0
13282 104.262 216.546 N 0
13283 132.098 131.443 N 0
13284 120.495 9.63 N 0
13285 102.743 54.4035 N 0
13286 200.126 218.125 N 0
13287 183.952 81.225 N 0
13288 195.139 160.344 N 0
13289 45.552 260.009 N 0
13290 14.6775 163.709 N 0
13291 14.6775 28.89 N 0
13292 44.0325 105.93 N 0
13293 74.907 240.75 N 0
13294 74.907 202.23 N 0
13295 44.0325 48.15 N 0
13296 73.3875 86.67 N 0
13297 221.682 198.865 N 0
13298 224.495 141.084 N 0
13299 221.682 179.605 N 0
13300 23.996 279.27 N 0
13301 16.1975 202.23 N 0
13302 14.6775 68.771 N 0
13303 44.0325 144.449 N 0
13304 141.417 282.758 N 0
13305 44.9005 182.969 N 0
13306 44.0325 67.41 N 0
13307 14.6775 125.19 N 0
13308 214.042 256.645 N 0
13309 246.646 98.4 N 0
13310 192.327 198.865 N 0
13311 53.3515 317.79 N 0
13312 15.5455 182.969 N 0
13313 14.6775 49.5115 N 0
13314 73.3875 125.19 N 0
13315 82.706 279.27 N 0
13316 45.552 202.23 N 0
13317 61.7855 28.89 N 0
13318 14.6775 105.93 N 0
13319 170.771 237.385 N 0
13320 161.452 119.746 N 0
13321 165.785 160.344 N 0
13322 45.552 221.49 N 0
13323 104.262 196.786 N 0
13324 61.7855 9.63 N 0
13325 48.3645 163.709 N 0
13326 103.61 169.964 N 0
13327 74.2555 182.969 N 0
13328 91.1405 28.89 N 0
13329 73.3875 67.41 N 0
13330 202.511 237.385 N 0
13331 195.139 141.084 N 0
13332 224.495 160.344 N 0
13333 133.758 100.485 N 0
13334 314.774 37.7577 N 0
13354 321.319 150.392 N 0
13357 261.626 236.421 N 0
13376 296.244 176.092 N 0
13386 283.374 138.768 N 0
13402 326.521 53.7131 N 0
13425 326.608 41.6708 N 0
13434 321.074 137.556 N 0
13472 290.107 130.575 N 0
13476 326.595 49.2981 N 0
13492 326.276 54.0355 N 0
13495 321.519 140.008 N 0
13499 284.779 224.782 N 0
13510 293.144 142.187 N 0
13517 326.511 51.92 N 0
13521 322 153.348 N 0
13530 269.47 232.643 N 0
13540 278.592 154.63 N 0
13543 123.101 127.011 N 0
13558 117.969 71.3248 N 0
13563 88.962 87.4022 N 0
13592 88.4983 86.1273 N 0
13613 86.4914 138.08 N 0
13619 120.142 162.016 N 0
13624 82.4604 151.047 N 0
13642 87.6245 140.205 N 0
13645 80.9853 135.647 N 0
13653 95.5688 206.634 N 0
13656 96.8993 41.5312 N 0
13666 88.4369 100.588 N 0
13679 150.993 168.362 N 0
13682 175.763 140.293 N 0
13696 177.169 146.562 N 0
13705 87.3942 161.363 N 0
13709 92.0591 205.221 N 0
13715 174.78 147.58 N 0
13721 91.0729 206.703 N 0
13727 73.7316 148.143 N 0
13734 79.0765 104.493 N 0
13746 179.82 139.149 N 0
13755 29.0271 78.8238 N 0
13764 68.6123 130.151 N 0
13771 83.272 151.49 N 0
13787 88.7318 175.028 N 0
13798 77.3018 149.05 N 0
13815 88.5304 39.3821 N 0
13829 179.826 140.706 N 0
13835 94.6554 41.9804 N 0
13866 100.606 31.389 N 0
13933 108.264 22.5057 N 0
14088 106.277 34.2939 N 0
14093 118.846 57.1702 N 0
14098 124.433 41.798 N 0
14103 203.827 40.7688 N 0
14144 311.024 46.0592 N 0
14159 273.664 10.9078 N 0
14179 200.462 22.8211 N 0
14194 295.056 42.5647 N 0
14235 263.511 27.3878 N 0
14247 278.378 8.02347 N 0
14263 218.066 117.565 N 0
14267 108.106 44.398 N 0
14270 118.231 21.8689 N 0
14280 277.564 9.57611 N 0
14306 119.573 111.528 N 0
14341 118.803 96.819 N 0
14371 123.97 142.269 N 0
14402 124.989 143.425 N 0
14407 280.091 22.6121 N 0
14421 273.786 33.6657 N 0
14426 175.256 141.003 N 0
14433 201.572 7.41756 N 0
14450 119.908 21.8108 N 0
14454 288.025 144.486 N 0
14484 142.959 109.375 N 0
14496 206.947 91.8626 N 0
14514 212.974 45.9913 N 0
14561 263.428 45.2239 N 0
14584 215.057 14.4005 N 0
14591 282.982 13.0023 N 0
14608 151.44 78.4743 N 0
14628 183.885 38.587 N 0
14637 278.034 109.528 N 0
14670 250.361 62.409 N 0
14678 219.423 16.9586 N 0
14684 271.133 114.807 N 0
14720 203.603 3.43601 N 0
14731 276.635 74.5329 N 0
14746 82.7451 138.678 N 0
14798 276.261 64.1613 N 0
14814 264.593 39.4665 N 0
14837 160.057 105.841 N 0
14851 293.505 80.0543 N 0
14858 189.5 55.1511 N 0
14868 289.422 120.227 N 0
14897 207.974 22.3375 N 0
14928 123.263 44.6681 N 0
14943 292.286 68.3698 N 0
14954 298.106 134.262 N 0
14977 248.093 49.4194 N 0
14986 257.367 66.8619 N 0
15021 290.554 28.637 N 0
15035 269.327 107.408 N 0
15070 256.779 71.6205 N 0
15109 69.1817 135.071 N 0
15161 173.702 36.7422 N 0
15185 292.748 62.7555 N 0
15200 120.407 82.3172 N 0
15241 294.299 61.1636 N 0
15247 248.357 18.5064 N 0
15264 228.846 38.0744 N 0
15292 203.368 35.4342 N 0
15321 90.0041 41.9847 N 0
15335 221.061 129.12 N 0
15348 196.496 63.8841 N 0
15364 134.505 72.2374 N 0
15375 258.909 7.96426 N 0
15380 284.392 71.3934 N 0
15396 233.669 24.042 N 0
15424 263.901 6.28865 N 0
15434 279.068 64.5494 N 0
15441 256.901 26.5584 N 0
15457 151.058 67.7897 N 0
15467 152.034 1.88292 N 0
15471 213.957 121.202 N 0
15477 160.705 71.1757 N 0
15512 275.797 49.3043 N 0
15523 174.076 49.8379 N 0
15539 284.454 114.128 N 0
15547 166.535 57.0731 N 0
15586 220.818 85.8166 N 0
15601 250.079 33.7099 N 0
15622 195.765 10.8115 N 0
15643 258.356 66.3535 N 0
15699 248.089 8.66958 N 0
15709 280.062 126.784 N 0
15719 272.133 54.6569 N 0
15735 64.9814 132.086 N 0
15770 221.057 62.7469 N 0
15790 88.2288 98.3159 N 0
15826 195.164 24.4106 N 0
15838 265.999 35.3773 N 0
15848 242.373 15.7005 N 0
15859 279.794 119.871 N 0
15883 166.081 0.978053 N 0
15892 149.483 177.481 N 0
15914 290.217 23.4155 N 0
15929 217.043 37.495 N 0
15943 156.708 96.9843 N 0
15979 105.92 42.2031 N 0
16009 208.59 29.0588 N 0
16032 256.134 35.4134 N 0
16056 279.128 125.191 N 0
16066 270.74 77.5424 N 0
16071 202.765 3.81193 N 0
16088 285.642 17.5391 N 0
16094 196.883 54.1249 N 0
16111 156.914 30.3136 N 0
16123 203.776 88.4984 N 0
16133 249.608 61.8461 N 0
16147 241.436 20.5544 N 0
16155 293.178 55.5756 N 0
16188 138.063 9.63134 N 0
16195 124.274 87.6154 N 0
16218 294.919 88.2857 N 0
16236 275.557 74.8013 N 0
16248 154.282 102.048 N 0
16266 293.221 37.0144 N 0
16277 198.143 104.689 N 0
16289 283.444 112.218 N 0
16299 275.989 17.7764 N 0
16307 283.836 25.0159 N 0
16333 203.437 43.5399 N 0
16347 217.556 10.5572 N 0
16360 167.76 148.282 N 0
16376 144.79 42.2492 N 0
16403 195.682 54.7911 N 0
16410 283.952 27.5284 N 0
16416 177.058 133.951 N 0
16423 229.138 65.3537 N 0
16475 235.098 133.017 N 0
16487 217.205 41.1967 N 0
16503 131.792 117.236 N 0
16507 211.184 18.8722 N 0
16524 239.045 6.56516 N 0
16529 81.3642 164.545 N 0
16539 238.16 52.5549 N 0
16566 280.113 132.769 N 0
16591 88.7363 42.441 N 0
16608 211.029 121.066 N 0
16614 247.45 111.157 N 0
16631 202.069 34.1973 N 0
16652 251.281 113.338 N 0
16657 287.638 72.0191 N 0
16666 158.459 98.2842 N 0
16679 285.808 79.5223 N 0
16687 220.186 74.1283 N 0
16716 119.495 118.394 N 0
16731 289.903 125.288 N 0
16740 174.305 25.1525 N 0
16745 101.862 40.9996 N 0
16758 138.818 86.5224 N 0
16776 291.784 100.759 N 0
16788 294.862 48.0326 N 0
16858 84.1545 171.17 N 0
16865 140.929 33.3266 N 0
16909 142.262 28.7526 N 0
16921 153.916 81.6638 N 0
16929 149.004 77.07 N 0
16944 266.252 56.2054 N 0
16985 140.26 80.1057 N 0
16995 216.789 29.9003 N 0
17031 163.666 34.5085 N 0
17045 286.913 38.2124 N 0
17060 264.638 8.87708 N 0
17071 163.805 76.6903 N 0
17076 160.43 79.1703 N 0
17087 176.891 37.6752 N 0
17101 231.24 121.104 N 0
17119 290.624 76.0678 N 0
17131 198.824 31.1209 N 0
17149 245.458 21.8062 N 0
17173 279.568 105.607 N 0
17233 243.543 11.1228 N 0
17245 185.36 45.756 N 0
17249 122.149 73.1676 N 0
17279 260.176 33.2729 N 0
17287 118.915 118.275 N 0
17308 114.55 44.5859 N 0
17317 164.215 46.2941 N 0
17323 277.277 115.703 N 0
17338 275.859 61.0028 N 0
17349 201.092 13.9408 N 0
17374 216.521 2.21545 N 0
17385 153.786 111.207 N 0
17392 224.56 79.4501 N 0
17407 173.518 56.0834 N 0
17418 238.704 115.355 N 0
17433 162.574 19.2913 N 0
17442 161.891 61.5188 N 0
17451 83.2094 137.012 N 0
17497 255.66 5.9245 N 0
17506 178.061 66.1047 N 0
17536 218.2 100.872 N 0
17542 281.595 150.703 N 0
17555 263.672 56.6759 N 0
17595 279.533 111.053 N 0
17610 274.853 47.5413 N 0
17619 278.413 71.9599 N 0
17650 292.298 112.554 N 0
17672 288.326 46.1023 N 0
17686 269.798 45.5466 N 0
17696 260.408 108.471 N 0
17709 253.919 59.986 N 0
17738 255.688 46.9206 N 0
17746 236.726 79.7562 N 0
17765 217.641 21.0124 N 0
17777 92.8228 56.8819 N 0
17781 147.46 88.4644 N 0
17801 211.145 116.991 N 0
17813 216.721 44.4611 N 0
17828 274.08 126.683 N 0
17843 240.582 68.152 N 0
17882 140.914 115.078 N 0
17889 233.234 107.717 N 0
17897 184.363 46.8156 N 0
17906 282.426 125.422 N 0
17920 92.2286 183.213 N 0
17927 213.181 5.20747 N 0
17942 63.8737 141.284 N 0
17957 243.968 7.32129 N 0
17968 247.214 76.0835 N 0
17988 187.405 57.1288 N 0
17998 182.097 56.4272 N 0
18017 292.892 22.9832 N 0
18034 245.531 77.9532 N 0
18080 280.941 54.5856 N 0
18084 248.141 74.6745 N 0
18116 285.267 24.6111 N 0
18143 277.212 3.7123 N 0
18154 289.643 135.209 N 0
18168 223.867 110.015 N 0
18174 210.243 110.267 N 0
18187 222.781 83.4477 N 0
18202 266.502 37.2561 N 0
18218 260.299 112.772 N 0
18226 291.141 111.777 N 0
18238 204.171 35.3373 N 0
18264 202.881 111.66 N 0
18272 271.716 29.3876 N 0
18278 273.289 120.763 N 0
18289 192.211 4.24388 N 0
18306 123.481 32.1886 N 0
18315 144.778 11.8163 N 0
18321 158.357 87.5934 N 0
18334 207.454 77.2124 N 0
18342 213.869 102.258 N 0
18346 141.788 42.6336 N 0
18369 255.781 39.0551 N 0
18401 221.153 7.4296 N 0
18417 281.048 144.651 N 0
18441 131.034 81.5541 N 0
18474 174.717 101.471 N 0
18491 234.665 83.6114 N 0
18511 281.583 55.051 N 0
18535 285.203 10.3101 N 0
18544 122.354 114.603 N 0
18588 178.532 67.2692 N 0
18607 199.798 38.6119 N 0
18623 163.818 2.58909 N 0
18635 259.784 111.568 N 0
18647 90.3572 41.9332 N 0
18665 283.687 53.8695 N 0
18675 229.874 108.188 N 0
18687 133.927 88.6039 N 0
18713 151.887 91.785 N 0
18738 273.409 105.13 N 0
18761 291.763 111.532 N 0
18773 159.672 47.6649 N 0
18778 247.201 11.3046 N 0
18786 245.705 54.1258 N 0
18810 182.196 24.4148 N 0
18817 204.534 61.0023 N 0
18837 177.641 56.0356 N 0
18855 101.929 39.1692 N 0
18899 68.3603 140.864 N 0
18908 243.231 49.984 N 0
18914 206.076 9.76155 N 0
18923 152.663 72.8447 N 0
18950 293.904 63.691 N 0
18974 198.56 109 N 0
18991 240.622 69.649 N 0
19002 253.869 9.38462 N 0
19009 248.289 110.712 N 0
19025 167.689 34.9193 N 0
19048 256.493 36.0374 N 0
19069 214.596 23.541 N 0
19094 245.101 29.4621 N 0
19137 195.041 53.0575 N 0
19140 242.265 23.6546 N 0
19159 126.83 114.259 N 0
19193 237.076 68.0317 N 0
19224 213.852 62.8326 N 0
19241 251.631 55.8106 N 0
19259 220.686 101.805 N 0
19302 220.145 54.5468 N 0
19344 276.614 39.951 N 0
19357 204.666 69.2074 N 0
19388 264.859 67.8047 N 0
19413 243.587 20.9278 N 0
19433 170.717 71.6308 N 0
19474 203.223 98.3009 N 0
19489 138.522 27.3048 N 0
19497 185.415 49.24 N 0
19500 209.693 112.391 N 0
19521 291.07 62.2123 N 0
19528 261.42 35.3658 N 0
19544 197.405 13.9894 N 0
19552 295.046 83.0625 N 0
19564 171.172 35.7241 N 0
19576 234.528 69.285 N 0
19590 274.4 18.9775 N 0
19600 192.118 68.5477 N 0
19614 274.42 30.6377 N 0
19634 289.719 10.0873 N 0
19643 180.148 28.3612 N 0
19668 165.06 76.525 N 0
19695 276.26 61.3041 N 0
19703 149.413 111.78 N 0
19737 284.55 107.056 N 0
19757 144.641 65.798 N 0
19766 123.752 93.6217 N 0
19779 167.273 17.7213 N 0
19786 264.869 108.614 N 0
19793 286.237 144.826 N 0
19803 239.346 112.228 N 0
19830 276.684 47.9957 N 0
19838 152.203 101.775 N 0
19872 189.16 43.8103 N 0
19877 137.679 117.257 N 0
19891 239.314 63.4282 N 0
19905 204.956 20.4283 N 0
19914 132.293 110.267 N 0
19946 154.169 58.0537 N 0
19954 178.924 58.488 N 0
19964 248.891 114.323 N 0
19983 195.247 0.921335 N 0
19990 291.219 101.583 N 0
20008 163.471 48.0851 N 0
20015 145.664 14.8228 N 0
20020 192.094 23.8369 N 0
20029 289.208 150.301 N 0
20033 86.7249 147.841 N 0
20037 263.933 51.9614 N 0
20051 243.601 150.414 N 0
20069 150.512 53.6515 N 0
20102 74.6075 136.047 N 0
20133 252.065 36.6229 N 0
20157 152.405 39.8544 N 0
20171 200.478 99.1674 N 0
20183 205.356 49.129 N 0
20200 131.965 73.6945 N 0
20214 128.683 87.2541 N 0
20224 183.404 36.7942 N 0
20229 251.94 64.0439 N 0
20245 136.503 40.1655 N 0
20284 182.438 60.5181 N 0
20291 69.4255 138.073 N 0
20313 203.664 46.1529 N 0
20329 290.146 40.2365 N 0
20342 188.853 36.0832 N 0
20349 225.826 84.9731 N 0
20359 146.353 85.8275 N 0
20373 258.214 74.2176 N 0
20384 247.977 76.8299 N 0
20406 133.305 121.717 N 0
20413 245.609 145.192 N 0
20429 256.583 51.7282 N 0
20432 223.897 46.3398 N 0
20486 214.496 44.2761 N 0
20501 275.577 37.3446 N 0
20509 256.069 93.4378 N 0
20543 189.957 28.8672 N 0
20550 177.64 35.491 N 0
20595 248.942 34.2187 N 0
20629 125.882 75.6845 N 0
20642 149.054 33.6913 N 0
20666 248.999 51.5788 N 0
20685 234.068 105.066 N 0
20711 230.917 111.274 N 0
20734 209.581 10.6205 N 0
20752 220.122 7.95501 N 0
20768 229.191 6.65669 N 0
20781 158.495 37.0742 N 0
20793 129.363 73.6963 N 0
20813 277.885 27.0031 N 0
20828 127.129 82.7439 N 0
20863 252.615 111.653 N 0
20872 229.68 127.411 N 0
20895 222.225 111.575 N 0
20907 233.667 73.7105 N 0
20913 250.854 38.9823 N 0
20944 286.253 39.7279 N 0
20960 239.857 43.5393 N 0
20989 244.229 60.7131 N 0
21015 293.143 12.204 N 0
21026 56.2014 119.979 N 0
21053 288.978 98.4382 N 0
21097 172.849 4.92822 N 0
21110 263.892 49.4022 N 0
21125 187.372 14.7433 N 0
21135 262.773 43.584 N 0
21166 256.224 80.3481 N 0
21186 261.947 19.9099 N 0
21221 268.147 28.417 N 0
21233 138.357 73.548 N 0
21247 258.762 19.6427 N 0
21277 270.024 17.4334 N 0
21289 265.64 19.6508 N 0
21325 288.92 6.87668 N 0
21336 251.558 63.0494 N 0
21342 258.895 74.0012 N 0
21346 206.829 67.0001 N 0
21358 91.4861 181.788 N 0
21364 276.136 62.9773 N 0
21388 293.277 98.5724 N 0
21393 125.305 87.1784 N 0
21409 199.613 112.159 N 0
21417 249.155 34.6339 N 0
21443 251.08 87.3454 N 0
21502 240.234 36.8663 N 0
21523 212.074 61.0016 N 0
21533 155.205 17.3852 N 0
21536 90.1728 43.972 N 0
21548 281.467 144.689 N 0
21562 219.164 120.417 N 0
21575 232.986 12.6248 N 0
21587 255.314 34.125 N 0
21608 160.321 89.2124 N 0
21618 217.276 31.0699 N 0
21642 235.654 125.761 N 0
21651 257.823 39.6966 N 0
21671 212.219 77.7244 N 0
21704 258.377 113.074 N 0
21717 264.934 3.62742 N 0
21729 286.621 71.7632 N 0
21736 251.411 52.9238 N 0
21739 150.935 92.567 N 0
21757 162.121 58.6039 N 0
21765 241.147 141.187 N 0
21781 203.927 83.6488 N 0
21806 125.462 32.6635 N 0
21816 261.91 26.5491 N 0
21838 281.002 41.8882 N 0
21855 282.683 104.251 N 0
21874 198.789 43.077 N 0
21896 274.923 10.1134 N 0
21910 204.592 36.9727 N 0
21924 145.693 94.3025 N 0
21938 185.636 28.5363 N 0
21950 190.029 108.929 N 0
21959 261.296 28.5632 N 0
21987 196.951 100.349 N 0
21997 191.896 43.9142 N 0
22000 96.6128 41.5601 N 0
22010 261.748 67.6897 N 0
22056 196.921 78.4681 N 0
22065 262.127 67.669 N 0
22116 232.028 40.8122 N 0
22148 240.927 134.823 N 0
22152 217.83 34.8185 N 0
22159 234.233 59.9731 N 0
22190 228.587 12.945 N 0
22204 138.659 86.9706 N 0
22218 238 98.415 N 0
22232 164.282 49.6589 N 0
22236 256.025 84.8993 N 0
22256 186.426 1.2395 N 0
22263 228.783 27.4075 N 0
22287 195.652 28.9539 N 0
22295 89.5977 179.385 N 0
22302 280.404 63.7932 N 0
22310 254.188 12.6065 N 0
22320 208.36 48.497 N 0
22337 238.153 51.8061 N 0
22374 214.523 50.0751 N 0
22410 240.265 125.592 N 0
22421 253.301 87.6417 N 0
22441 227.183 94.3702 N 0
22449 206.201 86.9335 N 0
22462 212.158 117.757 N 0
22488 278.857 104.848 N 0
22510 259.415 34.8512 N 0
22525 279.878 135.085 N 0
22529 262.694 52.1419 N 0
22541 152.649 45.4453 N 0
22545 140.247 12.1334 N 0
22552 237.76 5.57448 N 0
22566 205.687 17.1988 N 0
22578 259.341 74.9569 N 0
22589 234.712 69.768 N 0
22601 209.918 13.7825 N 0
22644 229.799 54.3667 N 0
22679 225.846 68.7683 N 0
22717 219.296 24.6614 N 0
22736 229.603 17.0104 N 0
22765 206.548 105.955 N 0
22776 191.974 32.7395 N 0
22783 196.263 22.4924 N 0
22790 235.535 28.039 N 0
22806 277.972 76.1455 N 0
22813 184.705 42.3134 N 0
22820 296.344 144.84 N 0
22823 279.131 118.213 N 0
22826 296.516 49.868 N 0
22834 268.856 96.938 N 0
22847 296.641 92.96 N 0
22850 318.715 249.084 N 0
22853 297.482 182.227 N 0
22856 318.437 234.329 N 0
22859 324.456 118.83 N 0
22866 295.723 187.498 N 0
22869 326.533 104.15 N 0
22874 320.693 232.228 N 0
22877 121.31 165.781 N 0
22882 90.0297 232.414 N 0
22888 119.633 160.844 N 0
22891 82.5139 136.085 N 0
22899 116.125 246.684 N 0
22905 119.376 223.409 N 0
22910 96.5216 180.072 N 0
22914 123.329 114.741 N 0
22918 103.336 29.585 N 0
22927 88.6625 102.433 N 0
22930 71.0571 129.881 N 0
22939 176.158 174.48 N 0
22943 136.473 187.766 N 0
22947 146.037 121.586 N 0
22951 163.124 102.552 N 0
22969 89.9456 227.782 N 0
22974 30.6494 250.623 N 0
22977 58.596 116.935 N 0
22980 96.9415 258.19 N 0
22983 96.3225 240.757 N 0
22989 93.4832 177.411 N 0
22996 133.887 141.324 N 0
22999 147.962 173.69 N 0
23005 150.114 168.215 N 0
23008 89.8595 245.847 N 0
23014 95.3706 226.716 N 0
23020 84.7615 135.143 N 0
23023 175.713 147.981 N 0
23038 90.251 227.317 N 0
23044 92.6258 206.565 N 0
23048 86.9235 136.916 N 0
23051 114.656 25.6419 N 0
23056 88.179 40.2285 N 0
23059 105.932 19.38 N 0
23062 180.68 209.969 N 0
23067 87.6945 136.193 N 0
23070 89.7034 234.545 N 0
23076 89.6985 241.474 N 0
23081 63.156 162.488 N 0
23084 29.1855 80.3765 N 0
23087 88.179 90.583 N 0
23090 63.2851 270.317 N 0
23096 63.156 163 N 0
23099 29.241 84.7997 N 0
23104 105.769 267.069 N 0
23110 96.057 180.454 N 0
23114 134.503 142.837 N 0
23117 67.9077 273.144 N 0
23122 67.9055 162.7 N 0
23125 29.1533 84.764 N 0
23129 95.0324 249.159 N 0
23135 93.4845 179.714 N 0
23138 88.179 101.586 N 0
23141 66.1393 173.219 N 0
23146 89.6925 197.701 N 0
23151 84.9045 134.94 N 0
23154 124.041 189.567 N 0
23157 45.4184 23.3463 N 0
23247 46.88 38.4 N 0
23250 88.4722 94.4615 N 0
23314 107.794 19.6369 N 0
23385 45.2506 19.4634 N 0
23391 108.974 20.7018 N 0
23553 115.669 20.1873 N 0
23668 87.7177 159.068 N 0
23684 135.471 3.35201 N 0
23751 206.26 67.3404 N 0
23764 270.379 55.56 N 0
23767 119.318 46.8987 N 0
23783 270.577 130.337 N 0
23817 236.034 210.162 N 0
23835 296.485 191.697 N 0
23871 230.574 56.006 N 0
23881 300.541 136.147 N 0
23885 195.883 48.4849 N 0
23899 128.618 19.605 N 0
23902 298.12 75.394 N 0
23906 47.0225 38.4 N 0
23909 59.166 58.32 N 0
23912 129.732 78.12 N 0
23915 160.955 107.364 N 0
23919 146.388 129.125 N 0
23924 163.561 89.64 N 0
23927 163.96 43.5245 N 0
23931 117.506 47.665 N 0
23935 130.919 19.38 N 0
23938 146.176 142.8 N 0
23941 133.34 76.377 N 0
23944 121.436 44.8935 N 0
23947 209.576 6.50564 N 0
23953 268.248 107.905 N 0
23956 278.75 58.2546 N 0
23960 119.563 96.7765 N 0
23964 118.502 83.863 N 0
23967 128.351 110.795 N 0
23970 145.676 53.5585 N 0
23975 224.951 42.48 N 0
23978 160.901 36.7882 N 0
23987 114.348 25.3964 N 0
23992 277.689 58.0185 N 0
23996 291.279 94.0554 N 0
24000 90.5423 42.9421 N 0
24009 102.264 44.6535 N 0
24012 267.733 127.926 N 0
24016 217.632 74.581 N 0
24019 279.595 154.596 N 0
24022 314.636 157.267 N 0
24026 151.546 153.734 N 0
24032 148.038 185.598 N 0
24036 146.495 143.961 N 0
24039 159.859 149.372 N 0
24071 295.946 1.3842 N 0
24076 257.81 137.116 N 0
24085 187.081 66.8735 N 0
24088 241.002 58.2995 N 0
24093 88.2659 95.9705 N 0
24107 118.448 104.946 N 0
24111 119.301 77.52 N 0
24114 145.414 188.681 N 0
24121 180.554 210.827 N 0
24133 202.191 96.3633 N 0
24147 201.591 60.2579 N 0
24185 233.684 55.8567 N 0
24189 220.882 74.2135 N 0
24192 131.15 75.345 N 0
24195 146.436 144.713 N 0
24202 117.506 44.8935 N 0
24205 127.115 21.525 N 0
24212 129.516 72.7865 N 0
24215 117.506 49.838 N 0
24218 265.801 101.157 N 0
24222 93.998 41.5885 N 0
24236 45.0067 36.797 N 0
24254 132.363 14.831 N 0
24258 326.228 100.533 N 0
24263 179.294 44.88 N 0
24266 57.3156 125.472 N 0
24282 239.364 59.1843 N 0
24287 251.753 120.377 N 0
24293 249.346 88.0488 N 0
24301 125.212 132.205 N 0
24308 146.991 139.834 N 0
24311 54.183 115.767 N 0
24314 194.461 90.975 N 0
24317 298.595 106.92 N 0
24320 28.6425 25.32 N 0
24323 117.58 70.3568 N 0
24328 259.46 116.074 N 0
24332 266.473 99.428 N 0
24335 28.6425 24.36 N 0
24338 28.9275 82.439 N 0
24342 107.262 29.1454 N 0
24378 324.28 115.867 N 0
24381 82.8657 139.832 N 0
24393 204.932 46.434 N 0
24396 234.142 41.7002 N 0
24400 192.374 67.2547 N 0
24411 235.237 54.4498 N 0
24431 198.781 92.9365 N 0
24438 146.889 68.0145 N 0
24441 178.804 132.572 N 0
24446 145.773 44.486 N 0
24449 88.2635 91.831 N 0
24452 263.348 114.398 N 0
24456 146.234 141.987 N 0
24459 205.746 92.4722 N 0
24468 273.918 20.0129 N 0
24474 152.333 106.92 N 0
24477 154.46 67.35 N 0
24480 240.975 55.5985 N 0
24483 192.722 61.3014 N 0
24488 210.002 55.069 N 0
24502 204.969 96.0307 N 0
24519 290.096 154.297 N 0
24525 175.389 71.16 N 0
24528 245.691 53.6037 N 0
24537 265.852 30.724 N 0
24540 226.692 92.1438 N 0
24548 164.298 82.9279 N 0
24564 193.214 97.2629 N 0
24570 167.796 92.344 N 0
24574 198.786 86.6745 N 0
24577 169.161 90.7355 N 0
24580 135.038 112.483 N 0
24583 119.4 59.4692 N 0
24587 153.013 140.673 N 0
24594 227.59 20.256 N 0
24597 182.889 110.235 N 0
24600 142.731 141.451 N 0
24603 245.293 84.3375 N 0
24607 203.452 105.693 N 0
24616 85.9173 172.848 N 0
24628 238.435 171.101 N 0
24631 279.173 151.615 N 0
24634 110.566 22.6615 N 0
24691 59.4225 78.6 N 0
24694 260.421 84.053 N 0
24697 260.264 27.609 N 0
24700 184.492 71.475 N 0
24703 266.883 59.08 N 0
24708 132.208 76.282 N 0
24711 157.572 109.996 N 0
24714 270.135 135.773 N 0
24717 275.553 58.4955 N 0
24720 205.386 53.3227 N 0
24723 252.936 108.656 N 0
24726 261.368 97.1449 N 0
24736 224.535 29.3109 N 0
24748 117.506 49.838 N 0
24751 231.855 94.7505 N 0
24754 117.506 49.029 N 0
24757 203.549 125.371 N 0
24772 204.616 70.8295 N 0
24783 208.389 94.0126 N 0
24797 88.2616 84.9088 N 0
24813 58.482 127.08 N 0
24816 122.515 70.4995 N 0
24819 28.6425 35.88 N 0
24822 228.863 96.815 N 0
24828 218.499 120.752 N 0
24831 234.505 48.4731 N 0
24867 90.2053 39.7381 N 0
24886 291.436 89.726 N 0
24889 149.954 168.728 N 0
24892 146.775 121.693 N 0
24895 241.516 77.26 N 0
24898 63.954 58.32 N 0
24901 164.878 109.596 N 0
24904 252.453 61.32 N 0
24907 115.189 66.7431 N 0
24913 189.163 60.713 N 0
24916 216.915 92.4641 N 0
24927 227.94 110.435 N 0
24934 232.116 57.5212 N 0
24962 217.052 131.334 N 0
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -10,6 +10,7 @@ import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import numpy as np
import traceback, sys
import random
"""plc_client_os docstrings.
......@@ -144,6 +145,7 @@ class PlacementCost(object):
"""
private function: Protobuf Netlist Parser
"""
print("#[INFO] Reading from " + self.netlist_file)
with open(self.netlist_file) as fp:
line = fp.readline()
node_cnt = 0
......@@ -245,6 +247,7 @@ class PlacementCost(object):
if node_name == "__metadata__":
# skipping metadata header
logging.info('[INFO NETLIST PARSER] skipping invalid net input')
elif attr_dict['type'][1] == 'macro':
# soft macro
# check if all required information is obtained
......@@ -387,7 +390,8 @@ class PlacementCost(object):
# store current node indx
self.port_indices.append(node_cnt-1)
# mapping connection degree to each macros
# 1. mapping connection degree to each macros
# 2. update offset based on Hard macro orientation
self.__update_connection()
# all hard macros are placed on canvas initially
......@@ -439,6 +443,9 @@ class PlacementCost(object):
# Width and Height should be defined on the same one-line
_width = float(line_item[1])
_height = float(line_item[3])
elif all(it in line_item for it in ['Area', 'stdcell', 'macros']):
# Total core area of modules
_area = float(line_item[3])
elif "Area" in line_item:
# Total core area of modules
_area = float(line_item[1])
......@@ -482,7 +489,7 @@ class PlacementCost(object):
elif all(it in line_item for it in ['MACROs'])\
and len(line_item) == 2:
_macros_cnt = int(line_item[1])
elif all(re.match(r'[0-9NEWS\.\-]+', it) for it in line_item)\
elif all(re.match(r'[0-9FNEWS\.\-]+', it) for it in line_item)\
and len(line_item) == 5:
# [node_index] [x] [y] [orientation] [fixed]
_node_plc[int(line_item[0])] = line_item[1:]
......@@ -556,9 +563,10 @@ class PlacementCost(object):
# restore placement for each module
try:
# print(sorted(list(info_dict['node_plc'].keys())))
assert sorted(self.port_indices +\
self.hard_macro_indices +\
self.soft_macro_indices) == list(info_dict['node_plc'].keys())
self.soft_macro_indices) == sorted(list(info_dict['node_plc'].keys()))
except AssertionError:
print('[ERROR PLC INDICES MISMATCH]', len(sorted(self.port_indices +\
self.hard_macro_indices +\
......@@ -572,6 +580,7 @@ class PlacementCost(object):
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('[ERROR PLC PARSER] %s' % str(e))
......@@ -589,6 +598,7 @@ class PlacementCost(object):
# set meta information
if ifReadComment:
print("[INFO] Retrieving Meta information from .plc comments")
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'])
......@@ -619,6 +629,10 @@ class PlacementCost(object):
print("[ERROR UPDATE CONNECTION] MACRO pins not found")
continue
# also update pin offset based on macro orientation
orientation = macro.get_orientation()
self.update_macro_orientation(macro_idx, orientation)
# Soft macro
elif self.is_node_soft_macro(macro_idx):
if macro_name in self.soft_macros_to_inpins.keys():
......@@ -709,8 +723,9 @@ class PlacementCost(object):
# Retrieve current pin node position
pin_node = self.modules_w_pins[pin_idx]
pin_node_x_offset, pin_node_y_offset = pin_node.get_offset()
# Google's Plc client DOES NOT compute (node_position + pin_offset) when reading input
return (ref_node_x + pin_node_x_offset, ref_node_y + pin_node_y_offset)
# return pin_node.get_pos()
def get_wirelength(self) -> float:
"""
......@@ -726,6 +741,9 @@ class PlacementCost(object):
x_coord = []
y_coord = []
# default value of weight
weight_fact = 1.0
# NOTE: connection only defined on PORT, soft/hard macro pins
if curr_type == "PORT" and mod.get_sink():
# add source position
......@@ -739,39 +757,47 @@ class PlacementCost(object):
# retrieve sink object
sink = self.modules_w_pins[sink_idx]
# only consider placed sink
ref_sink = self.modules_w_pins[self.get_ref_node_id(sink_idx)]
if not ref_sink.get_placed_flag():
continue
# retrieve location
# ref_sink = self.modules_w_pins[self.get_ref_node_id(sink_idx)]
# if not placed, skip this edge
# if not ref_sink.get_placed_flag():
# x_coord.append(0)
# y_coord.append(0)
# else:# retrieve location
x_coord.append(self.__get_pin_position(sink_idx)[0])
y_coord.append(self.__get_pin_position(sink_idx)[1])
elif curr_type == "MACRO_PIN":
ref_mod = self.modules_w_pins[self.get_ref_node_id(mod_idx)]
if not ref_mod.get_placed_flag():
continue
# # if not placed, skip this edge
# if not ref_mod.get_placed_flag():
# continue
# get pin weight
weight_fact = mod.get_weight()
# add source position
x_coord.append(self.__get_pin_position(mod_idx)[0])
y_coord.append(self.__get_pin_position(mod_idx)[1])
if mod.get_sink():
if mod.get_weight() != 0:
norm_fact = mod.get_weight()
for input_list in mod.get_sink().values():
for sink_name in input_list:
# retrieve indx in modules_w_pins
input_idx = self.mod_name_to_indices[sink_name]
# sink_ref_mod = self.modules_w_pins[self.get_ref_node_id(mod_idx)]
# if not placed, skip this edge
# if not sink_ref_mod.get_placed_flag():
# x_coord.append(0)
# y_coord.append(0)
# else:
# retrieve location
x_coord.append(self.__get_pin_position(input_idx)[0])
y_coord.append(self.__get_pin_position(input_idx)[1])
if x_coord:
if norm_fact != 1.0:
total_hpwl += norm_fact * \
total_hpwl += weight_fact * \
(abs(max(x_coord) - min(x_coord)) + \
abs(max(y_coord) - min(y_coord)))
else:
total_hpwl += (abs(max(x_coord) - min(x_coord))\
+ abs(max(y_coord) - min(y_coord)))
return total_hpwl
def abu(self, xx, n = 0.1):
......@@ -988,8 +1014,8 @@ class PlacementCost(object):
module = self.modules_w_pins[module_idx]
# skipping unplaced module
if not module.get_placed_flag():
continue
# if not module.get_placed_flag():
# continue
module_h = module.get_height()
module_w = module.get_width()
......@@ -1720,7 +1746,6 @@ class PlacementCost(object):
[IGNORE] THIS DOES NOT AFFECT DENSITY. SHOULD WE IMPLEMENT THIS AT ALL?
make soft macros as squares
"""
return
for mod_idx in self.soft_macro_indices:
mod = self.modules_w_pins[mod_idx]
mod_area = mod.get_width() * mod.get_height()
......@@ -1945,6 +1970,47 @@ class PlacementCost(object):
mod.set_orientation(orientation)
macro = self.modules_w_pins[node_idx]
macro_name = macro.get_name()
hard_macro_pins = self.hard_macros_to_inpins[macro_name]
orientation = macro.get_orientation()
# update all pin offset
for pin_name in hard_macro_pins:
pin = self.modules_w_pins[self.mod_name_to_indices[pin_name]]
x_offset, y_offset = pin.get_offset()
x_offset_org = x_offset
if orientation == "N":
pass
elif orientation == "FN":
x_offset = -x_offset
pin.set_offset(x_offset, y_offset)
elif orientation == "S":
x_offset = -x_offset
y_offset = -y_offset
pin.set_offset(x_offset, y_offset)
elif orientation == "FS":
y_offset = -y_offset
pin.set_offset(x_offset, y_offset)
elif orientation == "E":
x_offset = y_offset
y_offset = -x_offset_org
pin.set_offset(x_offset, y_offset)
elif orientation == "FE":
x_offset = -y_offset
y_offset = -x_offset_org
pin.set_offset(x_offset, y_offset)
elif orientation == "W":
x_offset = -y_offset
y_offset = x_offset_org
pin.set_offset(x_offset, y_offset)
elif orientation == "FW":
x_offset = y_offset
y_offset = x_offset_org
pin.set_offset(x_offset, y_offset)
def update_port_sides(self):
"""
Define Port "Side" by its location on canvas
......@@ -2317,6 +2383,356 @@ class PlacementCost(object):
plt.show()
plt.close('all')
'''
FD Placement below shares the same functionality as the FDPlacement/fd_placement.py
'''
def __ifOverlap(self, u_i, v_i, ux=0, uy=0, vx=0, vy=0):
'''
Detect if the two modules are overlapping or not (w/o using block structure)
'''
# extract first macro
u_side = self.modules_w_pins[u_i].get_height()
u_x1 = self.modules_w_pins[u_i].get_pos()[0] + ux - u_side/2 # left
u_x2 = self.modules_w_pins[u_i].get_pos()[0] + ux + u_side/2 # right
u_y1 = self.modules_w_pins[u_i].get_pos()[1] + uy + u_side/2 # top
u_y2 = self.modules_w_pins[u_i].get_pos()[1] + uy - u_side/2 # bottom
# extract second macro
v_side = self.modules_w_pins[v_i].get_height()
v_x1 = self.modules_w_pins[v_i].get_pos()[0] + vx - v_side/2 # left
v_x2 = self.modules_w_pins[v_i].get_pos()[0] + vx + v_side/2 # right
v_y1 = self.modules_w_pins[v_i].get_pos()[1] + vy + v_side/2 # top
v_y2 = self.modules_w_pins[v_i].get_pos()[1] + vy - v_side/2 # bottom
return u_x1 < v_x2 and u_x2 > v_x1 and u_y1 > v_y2 and u_y2 < v_y1
def __repulsive_force(self, repel_factor, node_i, node_j):
'''
Calculate repulsive force between two nodes node_i, node_j
'''
if repel_factor == 0.0:
return 0.0, 0.0
# retrieve module instance
mod_i = self.modules_w_pins[node_i]
mod_j = self.modules_w_pins[node_j]
# retrieve module position
x_i, y_i = mod_i.get_pos()
x_j, y_j = mod_j.get_pos()
# get dist between x and y
x_dist = x_i - x_j
y_dist = y_i - y_j
# get dist of hypotenuse
hypo_dist = math.sqrt(x_dist**2 + y_dist**2)
# compute force in x and y direction
if hypo_dist <= 1e-10:
return math.sqrt(repel_factor), math.sqrt(repel_factor)
else:
f_x = repel_factor * x_dist / hypo_dist
f_y = repel_factor * y_dist / hypo_dist
return f_x, f_y
def __repulsive_force_hard_macro(self, repel_factor, h_node_i, s_node_j):
'''
Calculate repulsive force between hard macro and soft macro
'''
if repel_factor == 0.0:
return 0.0, 0.0
# retrieve module instance
h_mod_i = self.modules_w_pins[h_node_i]
s_mod_j = self.modules_w_pins[s_node_j]
# retrieve module position
x_i, y_i = h_mod_i.get_pos()
x_j, y_j = s_mod_j.get_pos()
# get dist between x and y
x_dist = x_i - x_j
y_dist = y_i - y_j
# get dist of hypotenuse
hypo_dist = math.sqrt(x_dist**2 + y_dist**2)
# compute force in x and y direction
if hypo_dist <= 1e-10 or self.__ifOverlap(h_node_i, s_node_j):
return x_dist/hypo_dist * (h_mod_i.get_height()/2 + s_mod_j.get_height()/2),\
y_dist/hypo_dist * (h_mod_i.get_height()/2 + s_mod_j.get_height()/2)
else:
return 0.0, 0.0
def __attractive_force(self, io_factor, attract_factor, node_i, node_j, io_flag = True, attract_exponent = 1):
'''
Calculate repulsive force between two nodes node_i, node_j
'''
# retrieve module instance
mod_i = self.modules_w_pins[node_i]
mod_j = self.modules_w_pins[node_j]
# retrieve module position
x_i, y_i = mod_i.get_pos()
x_j, y_j = mod_j.get_pos()
# get dist between x and y
x_dist = x_i - x_j - mod_i.get_height()/2 - mod_j.get_height()/2
y_dist = y_i - y_j - mod_i.get_height()/2 - mod_j.get_height()/2
# get dist of hypotenuse
hypo_dist = math.sqrt(x_dist**2 + y_dist**2)
# compute force in x and y direction
if hypo_dist <= 0.0 or self.__ifOverlap(u_i=node_i, v_i=node_j):
return 0.0, 0.0
else:
if io_flag:
temp_f = io_factor * (hypo_dist ** attract_exponent)
else:
temp_f = attract_factor * (hypo_dist ** attract_exponent)
f_x = x_dist / hypo_dist * temp_f
f_y = y_dist / hypo_dist * temp_f
return f_x, f_y
def __centralize(self, mod_id):
'''
Pull the modules to the nearest center of the gridcell
'''
mod = self.modules_w_pins[mod_id]
mod_x, mod_y = mod.get_pos()
# compute grid cell col
# why / 2.0?
col = round((mod_x - self.grid_width / 2.0) / self.grid_width)
if (col < 0):
col = 0
elif col > self.grid_col - 1:
col = self.grid_col - 1
row = round((mod_y - self.grid_height / 2.0) / self.grid_height)
if (row < 0):
row = 0
elif row > self.grid_row - 1:
row = self.grid_row - 1
mod.set_pos((col + 0.5) * self.grid_width, (row + 0.5) * self.grid_height)
def __centeralize_circle(self, mod_id):
'''
Pull the modules to a randomized unit circle in the center of the canvas
'''
r = 1 * math.sqrt(random.random())
theta = random.random() * 2 * math.pi
centerX = self.width / 2
centerY = self.height / 2
self.modules_w_pins[mod_id].set_pos(centerX + r * math.cos(theta), centerY + r * math.sin(theta))
def __boundary_check(self, mod_id):
'''
Make sure all the clusters are placed within the canvas
'''
mod = self.modules_w_pins[mod_id]
mod_x, mod_y = mod.get_pos()
if mod_x < 0.0:
mod_x = 0.0
if mod_x > self.width:
mod_x = self.width
if mod_y < 0.0:
mod_y = 0.0
if mod_y > self.height:
mod_y = self.height
mod.set_pos(mod_x, mod_y)
def __fd_placement(self, io_factor, max_displacement, attract_factor, repel_factor):
'''
Force-directed Placement for standard-cell clusters
'''
# store x/y displacement for all soft macro disp
soft_macro_disp = {}
for mod_idx in self.soft_macro_indices:
soft_macro_disp[mod_idx] = [0.0, 0.0]
def add_displace(mod_id, x_disp, y_disp):
'''
Add the displacement
'''
soft_macro_disp[mod_id][0] += x_disp
soft_macro_disp[mod_id][1] += y_disp
def update_location(mod_id, x_disp, y_disp):
'''
Update the displacement to the coordiante
'''
x_pos, y_pos = self.modules_w_pins[mod_id].get_pos()
# logging.info("{} {} {} {}".format(x_pos, y_pos, x_disp, y_disp))
self.modules_w_pins[mod_id].set_pos(x_pos + x_disp, y_pos + y_disp)
def piecewise_sigmoid(x, shift = 50):
if x >= 0:
return 1/(math.exp(-x+shift) + 1)
else:
return -1/(math.exp(x+shift) + 1)
##SOFT_SOFT REPEL###############################################################################################
# calculate the repulsive forces
# repulsive forces between stdcell clusters
if repel_factor != 0.0:
# temp storing the soft macro count
xr_collection = [0] * len(self.modules_w_pins)
yr_collection = [0] * len(self.modules_w_pins)
# repulsive forces between stdcell clusters and stdcell clusters
for mod_i in self.soft_macro_indices:
for mod_j in self.soft_macro_indices:
if (mod_i <= mod_j):
continue
repul_x, repul_y = self.__repulsive_force(repel_factor=repel_factor,
node_i=mod_i, node_j=mod_j)
xr_collection[mod_i] += 1.0 * repul_x
yr_collection[mod_i] += 1.0 * repul_y
xr_collection[mod_j] += -1.0 * repul_x
yr_collection[mod_j] += -1.0 * repul_y
# finding max x y displacement
max_x_disp, max_y_disp = (0.0, 0.0)
for xr, yr in zip(xr_collection, yr_collection):
if xr != 0.0:
max_x_disp = max(max_x_disp, abs(xr))
if yr != 0.0:
max_y_disp = max(max_y_disp, abs(yr))
# prevent zero division
if max_x_disp == 0.0:
max_x_disp = 1.0
if max_y_disp == 0.0:
max_y_disp = 1.0
scaling = 2.0
for mod_idx in self.soft_macro_indices:
add_displace(mod_idx, scaling * xr_collection[mod_idx] / max_x_disp, scaling * yr_collection[mod_idx] / max_y_disp)
##SOFT_HARD REPEL###############################################################################################
if repel_factor != 0.0:
# temp storing the soft macro count
xr_collection = [0] * len(self.modules_w_pins)
yr_collection = [0] * len(self.modules_w_pins)
# repulsive forces between stdcell clusters and macros
for mod_i in self.soft_macro_indices:
for mod_j in self.hard_macro_indices:
repul_x, repul_y = self.__repulsive_force_hard_macro(repel_factor=repel_factor,
h_node_i=mod_i, s_node_j=mod_j)
xr_collection[mod_i] += 1.0 * repul_x
yr_collection[mod_i] += 1.0 * repul_y
# finding max x y displacement
max_x_disp, max_y_disp = (0.0, 0.0)
for xr, yr in zip(xr_collection, yr_collection):
if xr != 0.0:
max_x_disp = max(max_x_disp, abs(xr))
if yr != 0.0:
max_y_disp = max(max_y_disp, abs(yr))
# prevent zero division
if max_x_disp == 0.0:
max_x_disp = 1.0
if max_y_disp == 0.0:
max_y_disp = 1.0
scaling = 4.0
for mod_idx in self.soft_macro_indices:
add_displace(mod_idx, scaling * xr_collection[mod_idx] / max_x_disp, scaling * yr_collection[mod_idx] / max_y_disp)
##NET ATTRACT###################################################################################################
if attract_factor != 0.0:
# temp storing the soft macro count
xr_collection = [0] * len(self.modules_w_pins)
yr_collection = [0] * len(self.modules_w_pins)
# calculate the attractive force
# traverse each edge
# the adj_matrix is a symmetric matrix
for driver_pin_idx, driver_pin in enumerate(self.modules_w_pins):
# only for soft macro
if driver_pin_idx in self.soft_macro_pin_indices and driver_pin.get_sink():
driver_mod_idx = self.get_ref_node_id(driver_pin_idx)
for sink_pin_name in driver_pin.get_sink().keys():
sink_mod_idx = self.mod_name_to_indices[sink_pin_name]
# if overlapped, dont attract further
if self.__ifOverlap(driver_mod_idx, sink_mod_idx):
continue
attrac_x, attrac_y = self.__attractive_force(io_factor=io_factor,
attract_factor=attract_factor,
node_i=driver_mod_idx,
node_j=sink_mod_idx
)
# if overlapped, dont attract further
if self.__ifOverlap(driver_mod_idx, sink_mod_idx, attrac_x, attrac_y):
continue
xr_collection[driver_mod_idx] += piecewise_sigmoid(-1.0 * attrac_x)
yr_collection[driver_mod_idx] += piecewise_sigmoid(-1.0 * attrac_y)
# finding max x y displacement
max_x_disp, max_y_disp = (0.0, 0.0)
for xr, yr in zip(xr_collection, yr_collection):
if xr != 0.0:
max_x_disp = max(max_x_disp, abs(xr))
if yr != 0.0:
max_y_disp = max(max_y_disp, abs(yr))
# prevent zero division
if max_x_disp == 0.0:
max_x_disp = 1.0
if max_y_disp == 0.0:
max_y_disp = 1.0
# not too much attract
scaling = 0.1
for mod_idx in self.soft_macro_indices:
add_displace(mod_idx, scaling * xr_collection[mod_idx] / max_x_disp, scaling * yr_collection[mod_idx] / max_y_disp)
for mod_idx in soft_macro_disp.keys():
# push all the macros to the nearest center of gridcell
update_location(mod_idx, *soft_macro_disp[mod_idx])
# Moved to here to save a for loop
# Based on our understanding, the stdcell clusters can be placed
# at any place in the canvas instead of the center of gridcells
self.__boundary_check(mod_idx)
def optimize_stdcells(self, use_current_loc, move_stdcells, move_macros,
log_scale_conns, use_sizes, io_factor, num_steps,
max_move_distance, attract_factor, repel_factor):
# initialize the position for all the macros and stdcell clusters
# YW: here I will ignore centering Macros since CT placement does that
for mod_idx in self.soft_macro_indices:
self.__centeralize_circle(mod_id = mod_idx)
for epoch_id, iterations in enumerate(num_steps):
logging.info("#[OPTIMIZING STDCELs] at num_step {}:".format(str(epoch_id)))
print("[INFO] max_displaccment = ", max_move_distance[epoch_id])
print("[INFO] attractive_factor = ", attract_factor[epoch_id])
print("[INFO] repulsive_factor = ", repel_factor[epoch_id])
print("[INFO] io_factor = ", io_factor)
print("[INFO] number of iteration = ", iterations)
for iter in range(iterations):
logging.info("# iteration {}:".format(str(iter)))
self.__fd_placement(io_factor=io_factor,
max_displacement=max_move_distance[epoch_id],
attract_factor=attract_factor[epoch_id],
repel_factor=repel_factor[epoch_id])
self.save_placement('epoch_{}.plc'.format(str(epoch_id)))
# Board Entity Definition
class Port:
def __init__(self, name, x = 0.0, y = 0.0, side = "BOTTOM"):
......@@ -2337,6 +2753,12 @@ class PlacementCost(object):
def get_orientation(self):
return self.orientation
def get_height(self):
return 0
def get_width(self):
return 0
def add_connection(self, module_name):
# NOTE: assume PORT names does not contain slash
ifPORT = False
......@@ -2700,6 +3122,10 @@ class PlacementCost(object):
def get_offset(self):
return self.x_offset, self.y_offset
def set_offset(self, x_offset, y_offset):
self.x_offset = x_offset
self.y_offset = y_offset
def get_name(self):
return self.name
......@@ -2734,19 +3160,6 @@ class PlacementCost(object):
def get_type(self):
return "MACRO_PIN"
# TODO finish this
# class StandardCell:
# def __init__( self, name,
# x = 0.0, y = 0.0, weight = 1.0):
# self.name = name
# self.x = float(x)
# self.y = float(y)
# self.x_offset = 0.0 # not used
# self.y_offset = 0.0 # not used
# self.macro_name = macro_name
# self.weight = weight
# self.sink = {}
def main():
test_netlist_dir = './Plc_client/test/'+\
'ariane_68_1.3'
......
......@@ -4,7 +4,6 @@ import pandas as pd
import sys
import os
import traceback
import argparse
import math
import re
from random import randrange
......@@ -57,6 +56,18 @@ Example:
--marv 8.339\
--smooth 2
$ python3 -m Plc_client.plc_client_os_test --netlist ./Plc_client/test/g657_ub5_nruns10_c5_r3_v3_rc1/netlist.pb.txt\
--plc ./Plc_client/test/g657_ub5_nruns10_c5_r3_v3_rc1/legalized.plc\
--width 1357.360\
--height 1356.880\
--col 22\
--row 30\
--rpmh 11.285\
--rpmv 12.605\
--marh 7.143\
--marv 8.339\
--smooth 0
$ python3 -m Plc_client.plc_client_os_test --netlist ./Plc_client/test/0P2M0m/netlist.pb.txt\
--width 500\
--height 500\
......@@ -68,6 +79,18 @@ Example:
--marv 5\
--smooth 2
$ python3 -m Plc_client.plc_client_os_test --netlist ./Plc_client/test/ariane_fd/ariane.pb.txt\
--plc ./Plc_client/test/ariane_fd/ariane.plc\
--width 1599.99\
--height 1598.8\
--col 27\
--row 23\
--rpmh 70.330\
--rpmv 74.510\
--marh 51.790\
--marv 51.790\
--smooth 2
Todo:
* Clean up code
* Extract argument from command line
......@@ -214,7 +237,7 @@ class PlacementCostTest():
print(" +++ TEST METADATA: PASS +++")
print(" +++++++++++++++++++++++++++")
def view_canvas(self, ifInital, ifReadComment):
def view_canvas(self, ifInital=False, ifReadComment=False):
print("############################ VIEW CANVAS ############################")
self.plc_os = plc_client_os.PlacementCost(netlist_file=self.NETLIST_PATH,
macro_macro_x_spacing=50,
......@@ -229,9 +252,17 @@ class PlacementCostTest():
ifInital=ifInital,
ifValidate=False,
ifReadComment=ifReadComment)
self.plc_os.set_routes_per_micron(self.RPMH, self.RPMV)
self.plc_os.set_macro_routing_allocation(self.MARH, self.MARV)
self.plc_os.set_congestion_smooth_range(self.SMOOTH)
self.plc_os.set_canvas_size(self.CANVAS_WIDTH, self.CANVAS_HEIGHT)
self.plc_os.set_placement_grid(self.GRID_COL, self.GRID_ROW)
# show canvas
self.plc_os.make_soft_macros_square()
self.plc_os.display_canvas(annotate=False, amplify=False)
def test_proxy_cost(self):
print("############################ TEST PROXY COST ############################")
# Google's Binary Executable
......@@ -245,6 +276,8 @@ class PlacementCostTest():
self.plc.get_overlap_threshold()
print("overlap_threshold default", self.plc.get_overlap_threshold())
# self.plc.make_soft_macros_square()
if self.PLC_PATH:
print("#[PLC FILE FOUND] Loading info from .plc file")
self.plc_os.set_canvas_boundary_check(False)
......@@ -257,22 +290,33 @@ class PlacementCostTest():
else:
print("#[PLC FILE MISSING] Using only netlist info")
# self.plc.make_soft_macros_square()
self.plc.set_routes_per_micron(self.RPMH, self.RPMV)
self.plc_os.set_routes_per_micron(self.RPMH, self.RPMV)
# self.plc.make_soft_macros_square()
self.plc.set_macro_routing_allocation(self.MARH, self.MARV)
self.plc_os.set_macro_routing_allocation(self.MARH, self.MARV)
# self.plc.make_soft_macros_square()
self.plc.set_congestion_smooth_range(self.SMOOTH)
self.plc_os.set_congestion_smooth_range(self.SMOOTH)
self.plc.set_canvas_size(self.CANVAS_WIDTH, self.CANVAS_HEIGHT)
# self.plc.make_soft_macros_square()
self.plc.set_placement_grid(self.GRID_COL, self.GRID_ROW)
# self.plc.make_soft_macros_square() # in effect
self.plc.set_canvas_size(self.CANVAS_WIDTH, self.CANVAS_HEIGHT)
self.plc_os.set_canvas_size(self.CANVAS_WIDTH, self.CANVAS_HEIGHT)
self.plc_os.set_placement_grid(self.GRID_COL, self.GRID_ROW)
self.plc.make_soft_macros_square()
self.plc_os.make_soft_macros_square()
# self.plc.make_soft_macros_square()
# self.plc_os.make_soft_macros_square()
# [IGNORE] create_blockage must be defined BEFORE set_canvas_size
# and set_placement_grid in order to be considered on the canvas
......@@ -297,7 +341,7 @@ class PlacementCostTest():
str(self.plc.get_cost()), self.plc_os.get_cost()))
print("GL WIRELENGTH: ", self.plc.get_wirelength())
print("OS WIRELENGTH: ", self.plc_os.get_wirelength())
exit(1)
# exit(1)
# Density
try:
......@@ -421,19 +465,11 @@ class PlacementCostTest():
except Exception as e:
print("[ERROR WIRELENGTH] Discrepancies found when computing wirelength -- GL {}, OS {}".format(
str(self.plc.get_cost()), self.plc_os.get_cost()))
# if remove all soft macros
# soft_macro_indices = [
# m for m in self.plc.get_macro_indices() if self.plc.is_node_soft_macro(m)
# ]
# for mod_idx in soft_macro_indices:
# self.plc_os.unplace_node(mod_idx)
# self.plc.unplace_node(mod_idx)
print("GL WIRELENGTH: ", self.plc.get_wirelength())
print("OS WIRELENGTH: ", self.plc_os.get_wirelength())
def test_proxy_density(self):
print("############################ TEST PROXY DENSITY ############################")
# Google's Binary Executable
......@@ -718,18 +754,6 @@ class PlacementCostTest():
init_placement=self.PLC_PATH
)
if self.PLC_PATH:
print("#[PLC FILE FOUND] Loading info from .plc file")
self.plc_util_os.set_canvas_boundary_check(False)
self.plc_util_os.restore_placement(self.PLC_PATH,
ifInital=True,
ifValidate=True,
ifReadComment=False)
self.plc_util.set_canvas_boundary_check(False)
self.plc_util.restore_placement(self.PLC_PATH)
else:
print("#[PLC FILE MISSING] Using only netlist info")
self.extractor = observation_extractor.ObservationExtractor(
plc=self.plc_util, observation_config=self._observation_config
)
......@@ -843,6 +867,42 @@ class PlacementCostTest():
self.plc_util_os.display_canvas(annotate=False)
def test_fd(self):
print("############################ TEST GOOGLE's FD Placer ############################")
self.plc_util = placement_util.create_placement_cost(
plc_client=plc_client,
netlist_file=self.NETLIST_PATH,
init_placement=self.PLC_PATH
)
self.plc_util_os = placement_util.create_placement_cost(
plc_client=plc_client_os,
netlist_file=self.NETLIST_PATH,
init_placement=self.PLC_PATH
)
self.plc_util.set_routes_per_micron(self.RPMH, self.RPMV)
self.plc_util_os.set_routes_per_micron(self.RPMH, self.RPMV)
self.plc_util.set_macro_routing_allocation(self.MARH, self.MARV)
self.plc_util_os.set_macro_routing_allocation(self.MARH, self.MARV)
self.plc_util.set_congestion_smooth_range(self.SMOOTH)
self.plc_util_os.set_congestion_smooth_range(self.SMOOTH)
self.plc_util.set_canvas_size(self.CANVAS_WIDTH, self.CANVAS_HEIGHT)
self.plc_util.set_placement_grid(self.GRID_COL, self.GRID_ROW)
self.plc_util_os.set_canvas_size(self.CANVAS_WIDTH, self.CANVAS_HEIGHT)
self.plc_util_os.set_placement_grid(self.GRID_COL, self.GRID_ROW)
placement_util.fd_placement_schedule(self.plc_util)
for node_index in placement_util.nodes_of_types(self.plc_util, ['MACRO']):
x_pos, y_pos = self.plc_util.get_node_location(node_index)
self.plc_util_os.set_soft_macro_position(node_index, x_pos, y_pos)
self.plc_util_os.display_canvas(annotate=False, amplify=False)
def test_environment(self):
print("############################ TEST ENVIRONMENT ############################")
env = environment.CircuitEnv(
......@@ -912,6 +972,26 @@ class PlacementCostTest():
print(" +++ TEST ENVIRONMENT: PASS +++")
print(" ++++++++++++++++++++++++++++++")
def test_fd_placement(self):
print("############################ TEST FDPLACEMENT ############################")
self.plc_util_os = placement_util.create_placement_cost(
plc_client=plc_client_os,
netlist_file=self.NETLIST_PATH,
init_placement=self.PLC_PATH
)
# placement util is incapable of setting routing resources
self.plc_util_os.set_routes_per_micron(self.RPMH, self.RPMV)
self.plc_util_os.set_macro_routing_allocation(self.MARH, self.MARV)
self.plc_util_os.set_congestion_smooth_range(self.SMOOTH)
self.plc_util_os.set_canvas_size(self.CANVAS_WIDTH, self.CANVAS_HEIGHT)
self.plc_util_os.set_placement_grid(self.GRID_COL, self.GRID_ROW)
placement_util.fd_placement_schedule(self.plc_util_os)
self.plc_util_os.display_canvas(annotate=False, amplify=False)
def parse_flags(argv):
parser = argparse_flags.ArgumentParser(
......@@ -970,7 +1050,8 @@ def main(args):
Uncomment any available tests
"""
# PCT.test_metadata()
PCT.test_proxy_cost()
# PCT.test_proxy_cost()
# PCT.test_proxy_hpwl()
# PCT.test_proxy_density()
# PCT.test_proxy_congestion()
# PCT.test_placement_util(keep_save_file=False)
......@@ -978,7 +1059,9 @@ def main(args):
# PCT.test_miscellaneous()
# PCT.test_observation_extractor()
# PCT.view_canvas()
# PCT.test_fd()
# PCT.test_environment()
PCT.test_fd_placement()
if __name__ == '__main__':
......
import re
import os, sys
import math
import numpy as np
import logging
import matplotlib.pyplot as plt
import pandas as pd
from torch import argmax
# disable scientific notation
np.set_printoptions(suppress=True)
# print full array
np.set_printoptions(threshold=sys.maxsize)
'''
META INFO
'''
# Directory that stores all plc file (must come from the same netlist)
PLC_DIR = "Plc_client/test/ariane"
assert os.path.isdir(PLC_DIR)
# Top X% of largest movement range
TOP_X = 1
# List to store every plc coordinate
PLC_COORD = []
# scan through every .plc file
for __, __, files in os.walk(PLC_DIR):
for plc_file in files:
if plc_file.endswith((".plc")):
plc_pth = os.path.join(PLC_DIR, plc_file)
print("[INFO] Reading plc file {}".format(plc_pth))
# store in numpy array for ease of computation
temp_coord = np.empty((1,2), float)
for cnt, line in enumerate(open(plc_pth, 'r')):
line_item = re.findall(r'[0-9A-Za-z\.\-]+', line)
# skip empty lines
if len(line_item) == 0:
continue
if all(re.match(r'[0-9FNEWS\.\-]+', it) for it in line_item)\
and len(line_item) == 5:
# extract pos
temp_coord = np.append(temp_coord, np.array([[float(line_item[1]),float(line_item[2])]]), axis=0)
# remove header row
temp_coord = temp_coord[1:, :]
# make sure every plc is aligned
if PLC_COORD:
assert PLC_COORD[-1].shape == temp_coord.shape
PLC_COORD.append(temp_coord)
print(temp_coord)
del temp_coord
# store all pair-wise distance
abs_dist_plc = np.empty((PLC_COORD[-1].shape[0],1), float)
# pair-wise distance of all plc files
for i in range(len(PLC_COORD)):
for j in range(len(PLC_COORD)):
if i == j:
continue
# find x/y position diff
diff_coord = PLC_COORD[i] - PLC_COORD[j]
# x_diff^2, y_diff^2
diff_coord = np.power(diff_coord, 2)
# sqrt(x_diff^2 + y_diff^2)
abs_dist_coord = np.sqrt(diff_coord[:, 0] + diff_coord[:, 1])
abs_dist_plc = np.append(abs_dist_plc, abs_dist_coord.reshape((-1, 1)), axis=1)
# remove header col
abs_dist_plc = abs_dist_plc[:, 1:]
TOP_N = int(math.floor(abs_dist_plc.shape[0] * (TOP_X/100.0)))
print(TOP_N)
'''
MACRO placement maximum distance + visual
'''
# across all the plc diff, the max distance [row wise]
max_dist = np.amax(abs_dist_plc, axis=1)
# top-n max distance
topn_max_dist_idx = np.argpartition(max_dist, -TOP_N)[-TOP_N:]
topn_max_dist_val = np.take(max_dist, topn_max_dist_idx)
x = range(topn_max_dist_val.shape[0])
y = topn_max_dist_val
n = topn_max_dist_idx
fig, ax = plt.subplots()
ax.set_title("Top {}% Maximum Placement Range".format(TOP_X))
ax.scatter(x, y, c = 'b')
ax.set_xlabel("module index")
ax.set_ylabel("distance")
for i, txt in enumerate(n):
ax.annotate(txt, (x[i], y[i]))
plt.show()
'''
MACRO placement box plot visual
'''
abs_dist_plc_df = pd.DataFrame(data=abs_dist_plc)
topn_max_dist_df = abs_dist_plc_df.iloc[topn_max_dist_idx, :]
topn_max_dist_df.T.boxplot()
plt.title("Top {}% Placement Range".format(TOP_X))
plt.xlabel("module index")
plt.ylabel("distance")
plt.show()
'''
MACRO placement variane test
'''
'''
MACRO placement std dev test
'''
import re
import os, sys
import math
import numpy as np
import logging
import matplotlib.pyplot as plt
import pandas as pd
import pandas as pd
SHEET_ID = '1dtG4uHzdw-Lfe_Vcm5uBRNjjxXNA4gmVarTr86hjYVo'
SHEET_NAME = 'Proxy_Cost_Comparison'
url = f'https://docs.google.com/spreadsheets/d/{SHEET_ID}/gviz/tq?tqx=out:csv&sheet={SHEET_NAME}'
proxy_df = pd.read_csv(url)
proxy_df = proxy_df.loc[:, ~proxy_df.isnull().all()]
print(proxy_df.columns)
proxy_df['postCTS_Congestion (V)'] = proxy_df['postCTS_Congestion (V)'].str.rstrip('%').astype('float') / 100.0
# compute correlation between postRouteOpt_std_cell_area and density_cost
print("postRoute_std_cell_area VS. Density_Cost",
proxy_df["postRoute_std_cell_area (um^2)"].corr(proxy_df["Density_Cost"]))
print("postRouteOpt_std_cell_area VS. Density_Cost",
proxy_df["postRouteOpt_std_cell_area (um^2)"].corr(proxy_df["Density_Cost"]))
# compute correlation between postRouteOpt_wirelength (um) and wirelength_cost
print("postRoute_wirelength VS. Wirelength_Cost",
proxy_df["postRoute_wirelength (um)"].corr(proxy_df["Wirelength_Cost"]))
print("postRouteOpt_wirelength VS. Wirelength_Cost",
proxy_df["postRouteOpt_wirelength (um)"].corr(proxy_df["Wirelength_Cost"]))
# compute correlation between postCTS_Congestion and congestion_cost
print("postCTS_Congestion VS. Congestion_Cost",
proxy_df["postCTS_Congestion (V)"].corr(proxy_df["Congestion_Cost"]))
\ No newline at end of file
import re
import os, sys
import math
import numpy as np
import logging
import matplotlib.pyplot as plt
import pandas as pd
from StatTest import util
# disable scientific notation
np.set_printoptions(suppress=True)
# print full array
np.set_printoptions(threshold=sys.maxsize)
"""Statistical Test docstrings.
* Robustness
* Use EvalCT for fixed policy rollout on the same training
set but different initialization.
* Stability
* Macro Movement Range
* Additional Note
* Loading weight back for training
"""
######################## META INFO ########################
# Directory that stores all plc file (must come from the same netlist)
PLC_DIR = "StatTest/test/flow2_68_1.3_ct"
PLC_PATH_COLLECTION = []
assert os.path.isdir(PLC_DIR)
# Top X% of largest movement range
TOP_X = 5
# List to store every plc coordinate
PLC_COORD = []
# hold hard macro, soft macro, port count
def init_method(plc_dir):
"""
Scan through every .plc file
"""
for __, __, files in os.walk(plc_dir):
for plc_file in files:
if plc_file.endswith((".plc")):
plc_pth = os.path.join(plc_dir, plc_file)
# plc path
PLC_PATH_COLLECTION.append(plc_pth)
print("#[INFO] Reading plc file {}".format(plc_pth))
# store in numpy array for ease of computation
temp_coord = np.empty((1,2), float)
for cnt, line in enumerate(open(plc_pth, 'r')):
line_item = re.findall(r'[0-9A-Za-z\.\-]+', line)
# skip empty lines
if len(line_item) == 0:
continue
if all(re.match(r'[0-9FNEWS\.\-]+', it) for it in line_item)\
and len(line_item) == 5:
# extract pos
temp_coord = np.append(temp_coord, np.array([[float(line_item[1]),float(line_item[2])]]), axis=0)
elif all(it in line_item for it in ['HARD', 'MACROs'])\
and len(line_item) == 3:
hard_macros_cnt = int(line_item[2])
elif all(it in line_item for it in ['PORTs'])\
and len(line_item) == 2:
ports_cnt = int(line_item[1])
elif all(it in line_item for it in ['SOFT', 'MACROs'])\
and len(line_item) == 3:
soft_macros_cnt = int(line_item[2])
# remove header row
temp_coord = temp_coord[1:, :]
# make sure every plc is aligned
if PLC_COORD:
assert PLC_COORD[-1].shape == temp_coord.shape
assert temp_coord.shape[0] == hard_macros_cnt + soft_macros_cnt + ports_cnt
PLC_COORD.append(temp_coord)
# print(temp_coord)
del temp_coord
return ports_cnt, hard_macros_cnt, soft_macros_cnt
def get_abs_dist():
# store all pair-wise distance
abs_dist_plc = np.empty((PLC_COORD[-1].shape[0],1), float)
# pair-wise distance of all plc files
for i in range(len(PLC_COORD)):
for j in range(len(PLC_COORD)):
if i == j:
continue
# find x/y position diff
diff_coord = PLC_COORD[i] - PLC_COORD[j]
# x_diff^2, y_diff^2
diff_coord = np.power(diff_coord, 2)
# sqrt(x_diff^2 + y_diff^2)
abs_dist_coord = np.sqrt(diff_coord[:, 0] + diff_coord[:, 1])
abs_dist_plc = np.append(abs_dist_plc, abs_dist_coord.reshape((-1, 1)), axis=1)
# remove header col
return abs_dist_plc[:, 1:]
def main():
ports_cnt, hard_macros_cnt, soft_macros_cnt = init_method(PLC_DIR)
abs_dist_plc = get_abs_dist()
print(hard_macros_cnt, ports_cnt, soft_macros_cnt)
hard_abs_dist_plc = abs_dist_plc[ports_cnt:(hard_macros_cnt+ports_cnt), :]
soft_abs_dist_plc = abs_dist_plc[ports_cnt+hard_macros_cnt:hard_macros_cnt+ports_cnt+soft_macros_cnt, :]
# PORT_IDX = list(range(0, ports_cnt, 1))
# HARD_MACRO_IDX = list(range(ports_cnt, hard_macros_cnt+ports_cnt, 1))
# SOFT_MACRO_IDX = list(range(hard_macros_cnt+ports_cnt, hard_macros_cnt+soft_macros_cnt+ports_cnt, 1))
# top n hard macro
HM_TOP_N = int(math.floor(hard_abs_dist_plc.shape[0] * (TOP_X/100.0)))
# top n soft macro
SM_TOP_N = int(math.floor(soft_abs_dist_plc.shape[0] * (TOP_X/100.0)))
print("[INFO] Using TOP {}% Largest Hard Macro Movement --- {} Macros in total.".format(TOP_X, HM_TOP_N))
print("[INFO] Using TOP {}% Largest Soft Macro Movement --- {} Macros in total.".format(TOP_X, SM_TOP_N))
############ HARD MACRO placement range maximum distance + visual ###############
# across all the plc diff, the max distance [row wise]
hm_max_dist = np.amax(hard_abs_dist_plc, axis=1)
# top-n max distance
hm_topn_max_dist_idx = np.argpartition(hm_max_dist, -HM_TOP_N)[-HM_TOP_N:]
hm_topn_max_dist_val = np.take(hm_max_dist, hm_topn_max_dist_idx)
x = range(hm_topn_max_dist_val.shape[0])
y = hm_topn_max_dist_val
n = hm_topn_max_dist_idx
fig, ax = plt.subplots()
ax.set_title("Top {}% Hard Macro Maximum Placement Range".format(TOP_X))
ax.scatter(x, y, c = 'b')
ax.set_xlabel("module index")
ax.set_ylabel("distance")
for i, txt in enumerate(n):
ax.annotate(txt, (x[i], y[i]))
plt.show()
############ SOFT MACRO placement range maximum distance + visual ###############
# across all the plc diff, the max distance [row wise]
sm_max_dist = np.amax(soft_abs_dist_plc, axis=1)
# top-n max distance
sm_topn_max_dist_idx = np.argpartition(sm_max_dist, -SM_TOP_N)[-SM_TOP_N:]
sm_topn_max_dist_val = np.take(sm_max_dist, sm_topn_max_dist_idx)
x = range(sm_topn_max_dist_val.shape[0])
y = sm_topn_max_dist_val
n = sm_topn_max_dist_idx
fig, ax = plt.subplots()
ax.set_title("Top {}% Soft Macro Maximum Placement Range".format(TOP_X))
ax.scatter(x, y, c = 'b')
ax.set_xlabel("module index")
ax.set_ylabel("distance")
for i, txt in enumerate(n):
ax.annotate(txt, (x[i], y[i]))
plt.show()
######################## HARD MACRO placement range box plot visual #############
hard_abs_dist_plc_df = pd.DataFrame(data=hard_abs_dist_plc)
hm_topn_max_dist_df = hard_abs_dist_plc_df.iloc[hm_topn_max_dist_idx, :]
hm_topn_max_dist_df.T.boxplot()
plt.title("Top {}% Hard Macro Placement Range".format(TOP_X))
plt.xlabel("module index")
plt.ylabel("distance")
plt.show()
######################## SOFT MACRO placement range box plot visual #############
soft_abs_dist_plc_df = pd.DataFrame(data=soft_abs_dist_plc)
sm_topn_max_dist_df = soft_abs_dist_plc_df.iloc[sm_topn_max_dist_idx, :]
sm_topn_max_dist_df.T.boxplot()
plt.title("Top {}% Soft Macro Placement Range".format(TOP_X))
plt.xlabel("module index")
plt.ylabel("distance")
plt.show()
######################## Density Heatmap ########################
util.extract_density_map(
os.path.join(PLC_DIR, "netlist.pb.txt"),
PLC_PATH_COLLECTION[0],
ifshow=True
)
######################## Congestion Heatmap #####################
util.extract_congestion_map(
os.path.join(PLC_DIR, "netlist.pb.txt"),
PLC_PATH_COLLECTION[0],
marh=7.143,
marv=8.339,
rpmh=11.285,
rpmv=12.605,
congestion_smooth_range=2,
ifshow=True
)
######################## L1 Norm & SSIM #####################
# pair-wise distance of all plc files
DENS_SMI = []
DENS_L1 = []
VCONG_SMI = []
VCONG_L1 = []
HCONG_SMI = []
HCONG_L1 = []
for i in range(len(PLC_PATH_COLLECTION)):
for j in range(len(PLC_PATH_COLLECTION)):
if i == j:
continue
print("####### Heat Map Comparison between {} and {} #######".format(os.path.basename(PLC_PATH_COLLECTION[i])
,os.path.basename(PLC_PATH_COLLECTION[j])))
dens_i = util.extract_density_map(os.path.join(PLC_DIR, "netlist.pb.txt"),
PLC_PATH_COLLECTION[i],
ifshow=False)
dens_j = util.extract_density_map(os.path.join(PLC_DIR, "netlist.pb.txt"),
PLC_PATH_COLLECTION[j],
ifshow=False)
print("#[INFO] Density map SMI: {}".format(util.SSIM(dens_i, dens_j)))
print("#[INFO] Density map L1 Dist: {}".format(util.l1_norm(dens_i, dens_j)))
DENS_SMI.append(util.SSIM(dens_i, dens_j))
DENS_L1.append(util.l1_norm(dens_i, dens_j))
vcong_i, hcong_i = util.extract_congestion_map(
os.path.join(PLC_DIR, "netlist.pb.txt"),
PLC_PATH_COLLECTION[i],
marh=7.143,
marv=8.339,
rpmh=11.285,
rpmv=12.605,
congestion_smooth_range=2,
ifshow=False
)
vcong_j, hcong_j = util.extract_congestion_map(
os.path.join(PLC_DIR, "netlist.pb.txt"),
PLC_PATH_COLLECTION[j],
marh=7.143,
marv=8.339,
rpmh=11.285,
rpmv=12.605,
congestion_smooth_range=2,
ifshow=False
)
print("#[INFO] V Congestion map SMI: {}".format(util.SSIM(vcong_i, vcong_j)))
print("#[INFO] V Congestion map L1 Dist: {}".format(util.l1_norm(vcong_i, vcong_j)))
print("#[INFO] H Congestion map SMI: {}".format(util.SSIM(hcong_i, hcong_j)))
print("#[INFO] H Congestion map L1 Dist: {}".format(util.l1_norm(hcong_i, hcong_j)))
VCONG_SMI.append(util.SSIM(vcong_i, vcong_j))
VCONG_L1.append(util.l1_norm(vcong_i, vcong_j))
HCONG_SMI.append(util.SSIM(hcong_i,hcong_j))
HCONG_L1.append(util.l1_norm(hcong_i, hcong_j))
print("DENS_SMI Range ({} ~ {})".format(min(DENS_SMI), max(DENS_SMI)))
print("DENS_L1 Range ({} ~ {})".format(min(DENS_L1), max(DENS_L1)))
print("VCONG_SMI Range ({} ~ {})".format(min(VCONG_SMI), max(VCONG_SMI)))
print("VCONG_L1 Range ({} ~ {})".format(min(VCONG_L1), max(VCONG_L1)))
print("HCONG_SMI Range ({} ~ {})".format(min(HCONG_SMI), max(HCONG_SMI)))
print("HCONG_L1 Range ({} ~ {})".format(min(HCONG_L1), max(HCONG_L1)))
if __name__ == "__main__":
main()
\ No newline at end of file
import os, sys
import pandas as pd
import numpy as np
import seaborn as sns
from Plc_client import plc_client_os
from Plc_client import placement_util_os as placement_util
import matplotlib.pyplot as plt
from skimage.metrics import structural_similarity
def heatmap(arr, title, show=True):
"""
util function for generating heat map from numpy arrays
"""
sns.set()
ax = sns.heatmap(arr, vmin=0, vmax=1, cmap="YlGnBu")
ax.set_title(title)
ax.set_xlabel("Columns")
ax.set_ylabel("Rows")
if show:
plt.show()
else:
plt.clf()
def extract_density_map(netlist_path, plc_path, ifshow=True):
"""
wrapper function for extracting density map
"""
plc_util_os = placement_util.create_placement_cost(
plc_client=plc_client_os,
netlist_file=netlist_path,
init_placement=plc_path
)
grid_cols, grid_rows = plc_util_os.get_grid_num_columns_rows()
dens_map = np.array(plc_util_os.get_grid_cells_density()).reshape(grid_rows, grid_cols)
heatmap(dens_map, "Placement Density Heatmap", ifshow)
return dens_map
def extract_congestion_map(netlist_path, plc_path, rpmh, rpmv, marh, marv, congestion_smooth_range, ifshow=True):
"""
wrapper function for extracting congestion map
"""
plc_util_os = placement_util.create_placement_cost(
plc_client=plc_client_os,
netlist_file=netlist_path,
init_placement=plc_path
)
plc_util_os.set_routes_per_micron(rpmh, rpmv)
plc_util_os.set_macro_routing_allocation(marh, marv)
plc_util_os.set_congestion_smooth_range(congestion_smooth_range)
grid_cols, grid_rows = plc_util_os.get_grid_num_columns_rows()
# vertical routing congestion map
vcong_map = np.array(plc_util_os.get_vertical_routing_congestion()).reshape(grid_rows, grid_cols)
heatmap(vcong_map, "Placement Vertical Congestion Heatmap", ifshow)
# horizontal routing congestion map
hcong_map = np.array(plc_util_os.get_horizontal_routing_congestion()).reshape(grid_rows, grid_cols)
heatmap(hcong_map, "Placement Horizontal Congestion Heatmap", ifshow)
return vcong_map, hcong_map
def SSIM(a, b):
return structural_similarity(a, b)
def l1_norm(a, b):
return np.linalg.norm(normalize(a)-normalize(b), ord=1)
def normalize(a):
return (a - np.min(a)) / (np.max(a) - np.min(a))
\ 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