mirror of
https://github.com/KLayout/klayout.git
synced 2026-08-28 17:06:31 +02:00
Tests for new DRC features (square, new attiribute tests)
This commit is contained in:
@@ -862,7 +862,7 @@ gsi::EnumIn<db::CompoundRegionOperationNode, db::RegionBBoxFilter::parameter_typ
|
||||
"This enum has been introduced in version 0.27."
|
||||
);
|
||||
|
||||
gsi::EnumIn<db::CompoundRegionOperationNode, db::RegionRatioFilter::parameter_type> decl_dbRegionRatioFilter_ParameterType ("db", "ParameterType",
|
||||
gsi::EnumIn<db::CompoundRegionOperationNode, db::RegionRatioFilter::parameter_type> decl_dbRegionRatioFilter_ParameterType ("db", "RatioParameterType",
|
||||
gsi::enum_const ("AreaRatio", db::RegionRatioFilter::AreaRatio,
|
||||
"@brief Measures the area ratio (bounding box area / polygon area)\n"
|
||||
) +
|
||||
|
||||
@@ -399,7 +399,7 @@ CODE
|
||||
# The plain function is equivalent to "primary.bbox_aspect_ratio".
|
||||
|
||||
def bbox_aspect_ratio
|
||||
DRCOpNodeRatioParameterFilter::new(@engine, RBA::CompoundRegionOperationNode::RegionRatioFilter::AspectRatio, self)
|
||||
DRCOpNodeRatioParameterFilter::new(@engine, RBA::CompoundRegionOperationNode::RatioParameterType::AspectRatio, self)
|
||||
end
|
||||
|
||||
# %DRC%
|
||||
@@ -430,7 +430,7 @@ CODE
|
||||
# The plain function is equivalent to "primary.bbox_aspect_ratio".
|
||||
|
||||
def relative_height
|
||||
DRCOpNodeRatioParameterFilter::new(@engine, RBA::CompoundRegionOperationNode::RegionRatioFilter::RelativeHeight, self)
|
||||
DRCOpNodeRatioParameterFilter::new(@engine, RBA::CompoundRegionOperationNode::RatioParameterType::RelativeHeight, self)
|
||||
end
|
||||
|
||||
# %DRC%
|
||||
@@ -459,7 +459,7 @@ CODE
|
||||
# The plain function is equivalent to "primary.area_ratio".
|
||||
|
||||
def area_ratio
|
||||
DRCOpNodeRatioParameterFilter::new(@engine, RBA::CompoundRegionOperationNode::RegionRatioFilter::AreaRatio, self)
|
||||
DRCOpNodeRatioParameterFilter::new(@engine, RBA::CompoundRegionOperationNode::RatioParameterType::AreaRatio, self)
|
||||
end
|
||||
|
||||
# %DRC%
|
||||
@@ -1240,7 +1240,7 @@ class DRCOpNodeWithCompare < DRCOpNode
|
||||
attr_accessor :reverse
|
||||
attr_accessor :original
|
||||
attr_accessor :lt, :le, :gt, :ge, :arg
|
||||
attr_accessor :ne_allowed
|
||||
attr_accessor :mode_or_supported
|
||||
attr_accessor :mode_or
|
||||
|
||||
def initialize(engine, original = nil, reverse = false)
|
||||
@@ -1249,7 +1249,7 @@ class DRCOpNodeWithCompare < DRCOpNode
|
||||
self.original = original
|
||||
self.description = original ? original.description : "BasicWithCompare"
|
||||
self.mode_or = false
|
||||
self.ne_allowed = false
|
||||
self.mode_or_supported = false
|
||||
end
|
||||
|
||||
def _description_for_dump
|
||||
@@ -1313,17 +1313,21 @@ class DRCOpNodeWithCompare < DRCOpNode
|
||||
end
|
||||
|
||||
def !=(other)
|
||||
if !self.ne_allowed
|
||||
raise("!= operator is not allowed for '" + self.description + "'")
|
||||
if self.respond_to?(:inverted)
|
||||
res = self.==(other).inverted
|
||||
else
|
||||
if !self.mode_or_supported
|
||||
raise("!= operator is not allowed for '" + self.description + "'")
|
||||
end
|
||||
if !(other.is_a?(Float) || other.is_a?(Integer))
|
||||
raise("!= operator needs a numerical argument for '" + self.description + "' argument")
|
||||
end
|
||||
res = self._self_or_original
|
||||
res.mode_or = true
|
||||
res.set_lt(other)
|
||||
res.set_gt(other)
|
||||
end
|
||||
if !(other.is_a?(Float) || other.is_a?(Integer))
|
||||
raise("!= operator needs a numerical argument for '" + self.description + "' argument")
|
||||
end
|
||||
res = self._self_or_original
|
||||
res.mode_or = true
|
||||
res.set_lt(other)
|
||||
res.set_gt(other)
|
||||
return res
|
||||
res
|
||||
end
|
||||
|
||||
def ==(other)
|
||||
@@ -1680,7 +1684,7 @@ class DRCOpNodeCheck < DRCOpNodeWithCompare
|
||||
self.other = other
|
||||
self.args = args
|
||||
self.description = check.to_s
|
||||
self.ne_allowed = true
|
||||
self.mode_or_supported = true
|
||||
end
|
||||
|
||||
def _description_for_dump
|
||||
@@ -1772,6 +1776,39 @@ class DRCOpNodeBBoxParameterFilter < DRCOpNodeWithCompare
|
||||
|
||||
end
|
||||
|
||||
class DRCOpNodeRatioParameterFilter < DRCOpNodeWithCompare
|
||||
|
||||
attr_accessor :input
|
||||
attr_accessor :parameter
|
||||
attr_accessor :inverse
|
||||
|
||||
def initialize(engine, parameter, input)
|
||||
super(engine)
|
||||
self.parameter = parameter
|
||||
self.input = input
|
||||
self.inverse = false
|
||||
self.description = parameter.to_s
|
||||
end
|
||||
|
||||
def do_create_node(cache)
|
||||
args = [ self.input.create_node(cache), self.parameter, self.inverse ]
|
||||
args << (self.gt ? self.gt : (self.ge ? self.ge : 0.0))
|
||||
args << (self.gt ? false : true)
|
||||
if self.lt || self.le
|
||||
args << (self.lt ? self.lt : self.le)
|
||||
args << (self.lt ? false : true)
|
||||
end
|
||||
RBA::CompoundRegionOperationNode::new_ratio_filter(*args)
|
||||
end
|
||||
|
||||
def inverted
|
||||
res = self.dup
|
||||
res.inverse = !res.inverse
|
||||
return res
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
class DRCOpNodeCornersFilter < DRCOpNodeWithCompare
|
||||
|
||||
attr_accessor :input
|
||||
|
||||
@@ -652,16 +652,16 @@ CODE
|
||||
# the operation acts similar to \Layer#with_angle.
|
||||
|
||||
%w(
|
||||
angle
|
||||
area
|
||||
holes
|
||||
hulls
|
||||
length
|
||||
odd_polygons
|
||||
perimeter
|
||||
rectangles
|
||||
squares
|
||||
rectilinear
|
||||
length
|
||||
angle
|
||||
squares
|
||||
).each do |f|
|
||||
# NOTE: these methods are fallback for the respective global ones which route to DRCLayer or here.
|
||||
eval <<"CODE"
|
||||
|
||||
@@ -1603,6 +1603,7 @@ CODE
|
||||
moved
|
||||
non_rectangles
|
||||
non_rectilinear
|
||||
non_squares
|
||||
non_strict
|
||||
not
|
||||
notch
|
||||
@@ -1646,6 +1647,7 @@ CODE
|
||||
snap
|
||||
snapped
|
||||
space
|
||||
squares
|
||||
start_segments
|
||||
strict
|
||||
texts
|
||||
@@ -1656,7 +1658,9 @@ CODE
|
||||
width
|
||||
with_angle
|
||||
with_area
|
||||
with_area_ratio
|
||||
with_bbox_area
|
||||
with_bbox_area_ratio
|
||||
with_bbox_height
|
||||
with_bbox_max
|
||||
with_bbox_min
|
||||
@@ -1664,13 +1668,17 @@ CODE
|
||||
with_length
|
||||
without_angle
|
||||
without_area
|
||||
without_area_ratio
|
||||
without_bbox
|
||||
without_bbox_area_ratio
|
||||
without_bbox_height
|
||||
without_bbox_max
|
||||
without_bbox_min
|
||||
without_length
|
||||
without_perimeter
|
||||
without_relative_height
|
||||
with_perimeter
|
||||
with_relative_height
|
||||
xor
|
||||
).each do |f|
|
||||
eval <<"CODE"
|
||||
|
||||
@@ -600,12 +600,12 @@ CODE
|
||||
if args.size == 1
|
||||
a = args[0]
|
||||
if a.is_a?(Range)
|
||||
DRCLayer::new(@engine, @engine._tcmd(self.data, 0, RBA::Region, :with_#{f}, @engine._prep_value(a.first), @engine._make_numeric_value(a.last), #{inv.inspect}))
|
||||
DRCLayer::new(@engine, @engine._tcmd(self.data, 0, RBA::Region, :with_#{f}, @engine._make_numeric_value(a.first), @engine._make_numeric_value(a.last), #{inv.inspect}))
|
||||
else
|
||||
DRCLayer::new(@engine, @engine._tcmd(self.data, 0, RBA::Region, :with_#{f}, @engine._prep_value(a), #{inv.inspect}))
|
||||
DRCLayer::new(@engine, @engine._tcmd(self.data, 0, RBA::Region, :with_#{f}, @engine._make_numeric_value(a), #{inv.inspect}))
|
||||
end
|
||||
elsif args.size == 2
|
||||
DRCLayer::new(@engine, @engine._tcmd(self.data, 0, RBA::Region, :with_#{f}, @engine._prep_value(args[0]), @engine._make_numeric_value(args[1]), #{inv.inspect}))
|
||||
DRCLayer::new(@engine, @engine._tcmd(self.data, 0, RBA::Region, :with_#{f}, @engine._make_numeric_value(args[0]), @engine._make_numeric_value(args[1]), #{inv.inspect}))
|
||||
else
|
||||
raise("Invalid number of arguments (1 or 2 expected)")
|
||||
end
|
||||
|
||||
@@ -198,3 +198,13 @@ TEST(13d)
|
||||
{
|
||||
run_test (_this, "13", true);
|
||||
}
|
||||
|
||||
TEST(14)
|
||||
{
|
||||
run_test (_this, "14", false);
|
||||
}
|
||||
|
||||
TEST(14d)
|
||||
{
|
||||
run_test (_this, "14", true);
|
||||
}
|
||||
|
||||
@@ -1127,3 +1127,13 @@ TEST(25d_spaceWithOptions)
|
||||
{
|
||||
run_test (_this, "25", true);
|
||||
}
|
||||
|
||||
TEST(26_attributes)
|
||||
{
|
||||
run_test (_this, "26", false);
|
||||
}
|
||||
|
||||
TEST(26d_attributes)
|
||||
{
|
||||
run_test (_this, "26", true);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user