-
Notifications
You must be signed in to change notification settings - Fork 61
/
Copy pathPlacementConstraint.scala
136 lines (125 loc) · 3.36 KB
/
PlacementConstraint.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
// See LICENSE for licence details.
package hammer_ir
import play.api.libs.json.{JsNumber, JsObject, JsString}
sealed abstract class PlacementConstraintType extends JSONConvertible {
override def toJSON = JsString(stringVal)
// Force objects to implement this since toString is defined by
// default.
def stringVal: String
override def toString = stringVal
}
object PlacementConstraintType {
def fromString(input: String): PlacementConstraintType = {
values.foreach { i =>
if (i.stringVal == input) return i
}
throw new IllegalArgumentException(s"Illegal PlacementConstraintType $input")
}
case object Dummy extends PlacementConstraintType {
override def stringVal = "dummy"
}
case object Placement extends PlacementConstraintType {
override def stringVal = "placement"
}
case object TopLevel extends PlacementConstraintType {
override def stringVal = "toplevel"
}
case object HardMacro extends PlacementConstraintType {
override def stringVal = "hardmacro"
}
case object Hierarchical extends PlacementConstraintType {
override def stringVal = "hierarchical"
}
case object Obstruction extends PlacementConstraintType {
override def stringVal = "obstruction"
}
def values = Seq(
Dummy, Placement, TopLevel, HardMacro, Hierarchical, Obstruction
)
}
sealed abstract class ObstructionType
object ObstructionType {
case object Place extends ObstructionType
case object Route extends ObstructionType
case object Power extends ObstructionType
}
case class Margins(
left: Double,
bottom: Double,
right: Double,
top: Double
)
case class PlacementConstraint(
path: String,
`type`: PlacementConstraintType,
x: Double,
y: Double,
width: Double,
height: Double,
orientation: Option[String],
margins: Option[Margins],
top_layer: Option[String],
layers: Option[Seq[String]],
obs_types: Option[Seq[ObstructionType]]
) extends HammerObject {
override def toJSON = {
JsObject(Seq(
"path" -> JsString(path),
"type" -> `type`.toJSON,
"x" -> JsNumber(x),
"y" -> JsNumber(y),
"width" -> JsNumber(width),
"height" -> JsNumber(height)
// TODO(edwardw): FIXME
))
}
}
object PlacementConstraint extends HammerObjectCompanion[PlacementConstraint] {
def apply(
path: String,
`type`: PlacementConstraintType,
x: Double,
y: Double,
width: Double,
height: Double
): PlacementConstraint = {
new PlacementConstraint(
path,
`type`,
x,
y,
width,
height,
None, // TODO(edwardw): FIXME
None,
None,
None,
None
)
}
/* Helper function used to convert strings to Double
* for forwards-compatibility with Decimal type. */
def doubleOrString(value: play.api.libs.json.JsLookupResult): Double = {
try {
value.as[Double]
} catch {
case _: play.api.libs.json.JsResultException =>
value.as[String].toDouble
}
}
override def fromJSON(json: JsObject): PlacementConstraint = {
new PlacementConstraint(
(json \ "path").as[String],
PlacementConstraintType.fromString((json \ "type").as[String]),
doubleOrString(json \ "x"),
doubleOrString(json \ "y"),
doubleOrString(json \ "width"),
doubleOrString(json \ "height"),
None, // TODO(edwardw): FIXME
None,
None,
None,
None
)
}
}