diff --git a/scripts/create_drc_samples.rb b/scripts/create_drc_samples.rb new file mode 100644 index 000000000..48fc9c569 --- /dev/null +++ b/scripts/create_drc_samples.rb @@ -0,0 +1,572 @@ + +# Run with: +# ./klayout -z -r ./create_drc_samples.rb -t -c klayoutrc_drc_samples + +def run_demo(gen, cmd, out) + + img_path = "src/lay/doc/images" + + mw = RBA::Application::instance::main_window + + cv = mw.create_layout(0) + ly = cv.layout + view = mw.current_view + + l0 = ly.insert_layer(RBA::LayerInfo::new(0, 0)) + l1 = ly.insert_layer(RBA::LayerInfo::new(1, 0)) + l2 = ly.insert_layer(RBA::LayerInfo::new(2, 0)) + lout_poly = ly.insert_layer(RBA::LayerInfo::new(101, 0)) + lout = ly.insert_layer(RBA::LayerInfo::new(100, 0)) + cell = ly.create_cell("TOP") + view.select_cell(0, cell.cell_index) + + lp = RBA::LayerProperties::new + lp.fill_color = lp.frame_color = 0xffffff + lp.source_layer = 0 + lp.source_datatype = 0 + lp.dither_pattern = 5 + lp.width = 0 + lp.name = "TXT" + view.insert_layer(view.end_layers, lp) + + lp = RBA::LayerProperties::new + lp.fill_color = lp.frame_color = 0xff8080 + lp.source_layer = 1 + lp.source_datatype = 0 + lp.dither_pattern = 5 + lp.name = "IN1" + view.insert_layer(view.end_layers, lp) + + lp = RBA::LayerProperties::new + lp.fill_color = lp.frame_color = 0x8080ff + lp.source_layer = 2 + lp.source_datatype = 0 + lp.dither_pattern = 9 + lp.name = "IN2" + view.insert_layer(view.end_layers, lp) + + lp = RBA::LayerProperties::new + lp.fill_color = lp.frame_color = 0x404040 + lp.source_layer = 101 + lp.source_datatype = 0 + lp.width = 0 + lp.dither_pattern = 0 + lp.transparent = true + lp.name = "OUT_POLY" + view.insert_layer(view.end_layers, lp) + + lp = RBA::LayerProperties::new + lp.fill_color = lp.frame_color = 0xffffff + lp.source_layer = 100 + lp.source_datatype = 0 + lp.width = 3 + lp.name = "OUT" + view.insert_layer(view.end_layers, lp) + + gen.produce(cell.shapes(l1), cell.shapes(l2)) + + view.zoom_box(RBA::DBox::new(-2.0, -1.0, 8.0, 9.0)) + + t = RBA::Text::new(cmd, -1500, 8500) + t.valign = 0 + t.font = 0 + t.size = 0.2 / ly.dbu + cell.shapes(l0).insert(t) + + eng = DRC::DRCEngine::new + data = eng.instance_eval(< 0 + a1 = RBA::ICplxTrans::new(300.0 / v.length, 30, false, 0, 0).trans(v) + a2 = RBA::ICplxTrans::new(300.0 / v.length, -30, false, 0, 0).trans(v) + cell.shapes(lout).insert(RBA::Edge::new(e.p2 - a1, e.p2)) + cell.shapes(lout).insert(RBA::Edge::new(e.p2 - a2, e.p2)) + end + cell.shapes(lout).insert(e) + end + elsif data.is_a?(RBA::EdgePairs) + cell.shapes(lout_poly).insert_as_polygons(data, 1) + cell.shapes(lout).insert(data.edges) + end + + view.update_content + view.save_image(img_path + "/" + out, 400, 400) + + puts "---> written #{img_path}/#{out}" + + mw.close_all + +end + +class Gen + def produce(s1, s2) + pts = [ + RBA::Point::new(0, 0), + RBA::Point::new(3000, 0), + RBA::Point::new(3000, 4000), + RBA::Point::new(5000, 4000), + RBA::Point::new(5000, 7000), + RBA::Point::new(2000, 7000), + RBA::Point::new(2000, 3000), + RBA::Point::new(0, 3000) + ]; + s1.insert(RBA::Polygon::new(pts)) + end +end + +gen = Gen::new + +run_demo gen, "input.width(1.2, euclidian)", "drc_width1.png" +run_demo gen, "input.width(1.2, projection)", "drc_width2.png" +run_demo gen, "input.width(1.2, square)", "drc_width3.png" +run_demo gen, "input.width(1.2, whole_edges)", "drc_width4.png" + +class Gen + def produce(s1, s2) + pts = [ + RBA::Point::new(4000, 0), + RBA::Point::new(4000, 1000), + RBA::Point::new(6000, 1000), + RBA::Point::new(6000, 2000), + RBA::Point::new(4000, 2000), + RBA::Point::new(4000, 6000), + RBA::Point::new(7000, 6000), + RBA::Point::new(7000, 0) + ]; + s1.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(0, 4000), + RBA::Point::new(0, 7000), + RBA::Point::new(3000, 7000), + RBA::Point::new(3000, 4000) + ]; + s1.insert(RBA::Polygon::new(pts)) + end +end + +gen = Gen::new + +run_demo gen, "input.space(1.2, euclidian)", "drc_space1.png" +run_demo gen, "input.notch(1.2, euclidian)", "drc_space2.png" +run_demo gen, "input.isolated(1.2, euclidian)", "drc_space3.png" + +class Gen + def produce(s1, s2) + pts = [ + RBA::Point::new(4000, 0), + RBA::Point::new(4000, 1000), + RBA::Point::new(6000, 1000), + RBA::Point::new(6000, 2000), + RBA::Point::new(4000, 2000), + RBA::Point::new(4000, 6000), + RBA::Point::new(7000, 6000), + RBA::Point::new(7000, 0) + ]; + s1.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(0, 0), + RBA::Point::new(0, 3000), + RBA::Point::new(3000, 3000), + RBA::Point::new(3000, 0) + ]; + s1.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(0, 4000), + RBA::Point::new(0, 7000), + RBA::Point::new(3000, 7000), + RBA::Point::new(3000, 4000) + ]; + s2.insert(RBA::Polygon::new(pts)) + end +end + +gen = Gen::new + +run_demo gen, "input1.separation(input2, 1.2, euclidian)", "drc_separation1.png" + +# ... + +class Gen + def produce(s1, s2) + pts = [ + RBA::Point::new(5000, 0), + RBA::Point::new(5000, 2000), + RBA::Point::new(4000, 2000), + RBA::Point::new(4000, 5000), + RBA::Point::new(3000, 5000), + RBA::Point::new(3000, 7000), + RBA::Point::new(6000, 7000), + RBA::Point::new(6000, 0) + ]; + s1.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(0, 0), + RBA::Point::new(0, 7000), + RBA::Point::new(2000, 7000), + RBA::Point::new(2000, 0) + ]; + s1.insert(RBA::Polygon::new(pts)) + end +end + +gen = Gen::new + +run_demo gen, "input.sized(1.8, 0.0).raw.merged(2)", "drc_raw1.png" + +class Gen + def produce(s1, s2) + pts = [ + RBA::Point::new(0, 0), + RBA::Point::new(0, 4000), + RBA::Point::new(3000, 7000), + RBA::Point::new(3000, 0) + ]; + s1.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(3000, 0), + RBA::Point::new(3000, 7000), + RBA::Point::new(6000, 4000), + RBA::Point::new(6000, 0) + ]; + s1.insert(RBA::Polygon::new(pts)) + end +end + +gen = Gen::new + +run_demo gen, "input.raw.sized(-0.5)", "drc_raw2.png" +run_demo gen, "input.sized(-0.5)", "drc_raw3.png" + + + +class Gen + def produce(s1, s2) + s1.insert(RBA::Box::new(0, 1000, 6000, 7000)) + s2.insert(RBA::Box::new(3000, 0, 6000, 6000)) + end +end + +gen = Gen::new + +run_demo gen, "input1.enclosing(input2, 2.0.um)", "drc_enc1.png" +run_demo gen, "input1.enclosing(input2, 2.0.um, projection)", "drc_enc2.png" + + +class Gen + def produce(s1, s2) + pts = [ + RBA::Point::new(0, 1000), + RBA::Point::new(0, 7000), + RBA::Point::new(7000, 7000), + RBA::Point::new(7000, 3000), + RBA::Point::new(4000, 3000), + RBA::Point::new(4000, 5000), + RBA::Point::new(2000, 5000), + RBA::Point::new(2000, 2000), + RBA::Point::new(1000, 2000), + RBA::Point::new(1000, 1000) + ]; + s2.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(2000, 0), + RBA::Point::new(2000, 6000), + RBA::Point::new(6000, 6000), + RBA::Point::new(6000, 0) + ]; + s1.insert(RBA::Polygon::new(pts)) + end +end + +gen = Gen::new + +run_demo gen, "input1.overlap(input2, 2.0.um)", "drc_overlap1.png" +run_demo gen, "input1.overlap(input2, 2.0.um, projection)", "drc_overlap2.png" + + +class Gen + def produce(s1, s2) + pts = [ + RBA::Point::new(1000, 0), + RBA::Point::new(1000, 2000), + RBA::Point::new(4000, 2000), + RBA::Point::new(4000, 5000), + RBA::Point::new(1000, 5000), + RBA::Point::new(1000, 7000), + RBA::Point::new(5000, 7000), + RBA::Point::new(5000, 0) + ]; + s1.insert(RBA::Polygon::new(pts)) + end +end + +gen = Gen::new + +run_demo gen, "input.edges.start_segments(1.um)", "drc_start_segments1.png" +run_demo gen, "input.edges.start_segments(0, 0.5)", "drc_start_segments2.png" + +run_demo gen, "input.edges.end_segments(1.um)", "drc_end_segments1.png" +run_demo gen, "input.edges.end_segments(0, 0.5)", "drc_end_segments2.png" + +run_demo gen, "input.edges.centers(1.um)", "drc_centers1.png" +run_demo gen, "input.edges.centers(0, 0.5)", "drc_centers2.png" + +run_demo gen, "input.edges.with_length(2.0)\n .extended(:out => 1.0)", "drc_extended1.png" +run_demo gen, "input.edges.with_length(0, 3.5)\n .extended(:out => 1.0)", "drc_extended2.png" +run_demo gen, "input.edges.with_length(0, 3.5)\n .extended(:out => 1.0, :joined => true)", "drc_extended3.png" +run_demo gen, "input.edges.with_length(2.0)\n .extended(0.0, -0.5, 1.0, -0.5)", "drc_extended4.png" + +class Gen + def produce(s1, s2) + pts = [ + RBA::Point::new(2000, 0), + RBA::Point::new(2000, 2000), + RBA::Point::new(4000, 2000), + RBA::Point::new(4000, 6000), + RBA::Point::new(5000, 6000), + RBA::Point::new(5000, 0) + ]; + s1.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(0, 3000), + RBA::Point::new(3000, 3000), + RBA::Point::new(3000, 4000), + RBA::Point::new(1000, 4000), + RBA::Point::new(1000, 7000), + RBA::Point::new(0000, 7000) + ]; + s1.insert(RBA::Polygon::new(pts)) + end +end + +gen = Gen::new + +run_demo gen, "input.extents", "drc_extents1.png" +run_demo gen, "input.edges.extents(0.1)", "drc_extents2.png" + + +class Gen + def produce(s1, s2) + s1.insert(RBA::Box::new(0, 1000, 2000, 3000)) + s1.insert(RBA::Box::new(4000, 1000, 6000, 3000)) + s1.insert(RBA::Box::new(4000, 5000, 6000, 7000)) + s1.insert(RBA::Box::new(0, 4000, 2000, 6000)) + s2.insert(RBA::Box::new(1000, 0, 6000, 4000)) + end +end + +gen = Gen::new + +run_demo gen, "input1.inside(input2)", "drc_inside.png" +run_demo gen, "input1.not_inside(input2)", "drc_not_inside.png" +run_demo gen, "input1.outside(input2)", "drc_outside.png" +run_demo gen, "input1.not_outside(input2)", "drc_not_outside.png" +run_demo gen, "input1.interacting(input2)", "drc_interacting.png" +run_demo gen, "input1.not_interacting(input2)", "drc_not_interacting.png" +run_demo gen, "input1.overlapping(input2)", "drc_overlapping.png" +run_demo gen, "input1.not_overlapping(input2)", "drc_not_overlapping.png" +run_demo gen, "input1.and(input2)", "drc_and1.png" +run_demo gen, "input1.or(input2)", "drc_or1.png" +run_demo gen, "input1.xor(input2)", "drc_xor1.png" +run_demo gen, "input1.not(input2)", "drc_not1.png" +run_demo gen, "input1.join(input2)", "drc_join1.png" +run_demo gen, "input1.edges.and(input2.edges)", "drc_and2.png" +run_demo gen, "input1.edges.or(input2.edges)", "drc_or2.png" +run_demo gen, "input1.edges.xor(input2.edges)", "drc_xor2.png" +run_demo gen, "input1.edges.not(input2.edges)", "drc_not2.png" +run_demo gen, "input1.edges.join(input2.edges)", "drc_join2.png" +run_demo gen, "input1.edges.and(input2)", "drc_and3.png" +run_demo gen, "input1.edges.not(input2)", "drc_not3.png" +run_demo gen, "input1.edges.inside_part(input2)", "drc_inside_part.png" +run_demo gen, "input1.edges.outside_part(input2)", "drc_outside_part.png" + +class Gen + def produce(s1, s2) + s1.insert(RBA::Box::new(0, 1000, 2000, 3000)) + s1.insert(RBA::Box::new(4000, 1000, 6000, 3000)) + s1.insert(RBA::Box::new(4000, 5000, 6000, 7000)) + s1.insert(RBA::Box::new(0, 4000, 2000, 6000)) + s2.insert(RBA::Box::new(4000, 1000, 6000, 3000)) + s2.insert(RBA::Box::new(1000, 0, 3000, 2000)) + end +end + +gen = Gen::new + +run_demo gen, "input1.in(input2)", "drc_in.png" +run_demo gen, "input1.not_in(input2)", "drc_not_in.png" + +class Gen + def produce(s1, s2) + pts = [ + RBA::Point::new(0, 0), + RBA::Point::new(0, 4000), + RBA::Point::new(2000, 4000), + RBA::Point::new(2000, 7000), + RBA::Point::new(6000, 7000), + RBA::Point::new(6000, 0) + ]; + h1 = [ + RBA::Point::new(1000, 1000), + RBA::Point::new(1000, 3000), + RBA::Point::new(3000, 3000), + RBA::Point::new(3000, 1000) + ]; + h2 = [ + RBA::Point::new(3000, 4000), + RBA::Point::new(3000, 6000), + RBA::Point::new(5000, 6000), + RBA::Point::new(5000, 4000) + ]; + poly = RBA::Polygon::new(pts) + poly.insert_hole(h1) + poly.insert_hole(h2) + s1.insert(poly) + end +end + +gen = Gen::new + +run_demo gen, "input.hulls", "drc_hulls.png" +run_demo gen, "input.holes", "drc_holes.png" + +class Gen + def produce(s1, s2) + pts = [ + RBA::Point::new(1000, 1000), + RBA::Point::new(4000, 1000), + RBA::Point::new(4000, 3000), + RBA::Point::new(1000, 3000) + ]; + s1.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(0, 0), + RBA::Point::new(0, 5000), + RBA::Point::new(3000, 5000), + RBA::Point::new(3000, 0) + ]; + s1.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(2000, 2000), + RBA::Point::new(6000, 2000), + RBA::Point::new(6000, 7000), + RBA::Point::new(2000, 7000) + ]; + s1.insert(RBA::Polygon::new(pts)) + end +end + +gen = Gen::new + +run_demo gen, "input.merged", "drc_merged1.png" +run_demo gen, "input.merged(1)", "drc_merged2.png" +run_demo gen, "input.merged(2)", "drc_merged3.png" +run_demo gen, "input.merged(3)", "drc_merged4.png" + + +class Gen + def produce(s1, s2) + pts = [ + RBA::Point::new(3000, 0), + RBA::Point::new(3000, 2000), + RBA::Point::new(5000, 2000), + RBA::Point::new(5000, 6000), + RBA::Point::new(6000, 6000), + RBA::Point::new(6000, 0) + ]; + s1.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(1000, 3000), + RBA::Point::new(4000, 3000), + RBA::Point::new(4000, 4000), + RBA::Point::new(2000, 4000), + RBA::Point::new(2000, 7000), + RBA::Point::new(1000, 7000) + ]; + s1.insert(RBA::Polygon::new(pts)) + end +end + +gen = Gen::new + +run_demo gen, "input.moved(-1.5.um, 0.5.um)", "drc_moved1.png" +run_demo gen, "input.rotated(15)", "drc_rotated1.png" +run_demo gen, "input.scaled(0.75)", "drc_scaled1.png" +run_demo gen, "t = RBA::DCplxTrans::new(0.75, 180.0, true, 7.0, 1.0)\ninput.transformed(t)", "drc_transformed1.png" + +class Gen + def produce(s1, s2) + pts = [ + RBA::Point::new(2000, 1000), + RBA::Point::new(2000, 1000), + RBA::Point::new(4000, 5000), + RBA::Point::new(4000, 1000) + ]; + s1.insert(RBA::Polygon::new(pts)) + end +end + +gen = Gen::new + +run_demo gen, "input.sized(1.um)", "drc_sized1.png" +run_demo gen, "input.sized(1.5.um, 0.5.um)", "drc_sized2.png" +run_demo gen, "input.sized(1.um, diamond_limit)", "drc_sized3.png" +run_demo gen, "input.sized(1.um, octagon_limit)", "drc_sized4.png" +run_demo gen, "input.sized(1.um, square_limit)", "drc_sized5.png" +run_demo gen, "input.sized(1.um, acute_limit)", "drc_sized6.png" + +class Gen + def produce(s1, s2) + pts = [ + RBA::Point::new(0, 0), + RBA::Point::new(0, 1000), + RBA::Point::new(4000, 5000), + RBA::Point::new(4000, 7000), + RBA::Point::new(6000, 5000), + RBA::Point::new(6000, 0), + RBA::Point::new(5000, 0), + RBA::Point::new(5000, 4000), + RBA::Point::new(1000, 0) + ]; + s1.insert(RBA::Polygon::new(pts)) + end +end + +gen = Gen::new + +run_demo gen, "input.edges.with_angle(45.degree)", "drc_with_angle1.png" +run_demo gen, "h = input.edges.with_angle(0)\nv = input.edges.with_angle(90)\n(h + v)", "drc_with_angle2.png" +run_demo gen, "input.with_angle(45.degree)", "drc_with_angle3.png" +run_demo gen, "input.without_angle(45.1.degree, 315.degree)", "drc_with_angle4.png" + +class Gen + def produce(s1, s2) + pts = [ + RBA::Point::new(0, 0), + RBA::Point::new(0, 7000), + RBA::Point::new(1000, 7000), + RBA::Point::new(1000, 1000), + RBA::Point::new(5000, 1000), + RBA::Point::new(5000, 7000), + RBA::Point::new(6000, 7000), + RBA::Point::new(6000, 0) + ]; + s1.insert(RBA::Polygon::new(pts)) + end +end + +gen = Gen::new + +run_demo gen, "input.rounded_corners(1.um, 2.um, 16)", "drc_rounded_corners.png" + diff --git a/scripts/extract_doc.rb b/scripts/extract_doc.rb new file mode 100755 index 000000000..2b0db87a5 --- /dev/null +++ b/scripts/extract_doc.rb @@ -0,0 +1,267 @@ +#!/usr/bin/ruby + +$script_call = $0 + " " + ARGV.join(" ") + +$key="%DRC%" +$infile="src/lay/built_in_macros/drc.lym" +$loc = "about/drc_ref" +$outfiles="src/lay/doc" +$title="DRC Reference" + +def create_ref(s) + if s =~ /(.*)#(.*)/ + "#{s}" + else + "#{s}" + end +end + +def create_class_doc_ref(s) + "#{s}" +end + +def escape(s) + s.gsub("&", "&"). + gsub("<", "<"). + gsub(">", ">"). + gsub(/\\([\w#]+)/) { create_ref($1) }. + gsub(/RBA::([\w#]+)/) { create_class_doc_ref($1) } +end + +def unescape(s) + s.gsub("&", "&").gsub("<", "<").gsub(">", ">") +end + +class DocItem + + attr_accessor :brief + attr_accessor :synopsis + attr_accessor :name + attr_accessor :doc + + def initialize(block) + + @paragraphs = [] + para = nil + self.synopsis = [] + in_code = false + + block.each do |b| + if in_code + if b =~ /@\/code/ + in_code = false + end + para.push(b) + elsif b =~ /^@brief\s+(.*?)\s*$/ + self.brief = $1 + elsif b =~ /^@name\s+(.*?)\s*$/ + self.name = $1 + elsif b =~ /^@synopsis\s+(.*?)\s*$/ + self.synopsis.push($1) + elsif b =~ /^@scope/ + # ignore scope commands + elsif b =~ /^\s*$/ + para && @paragraphs.push(para) + para = nil + else + para ||= [] + para.push(b) + if b =~ /@code/ + in_code = true + end + end + end + + para && @paragraphs.push(para) + + end + + def produce_doc + + if @paragraphs.empty? + return "" + end + + doc = "

\n" + + @paragraphs.each_with_index do |p, i| + + i > 0 && doc += "

\n" + + p.each do |pp| + doc += escape(pp). + gsub(/\\@/, "&at;"). + gsub(/\s*@code\s*/, "

").
+              gsub(/\s*@\/code\s*/, "
"). + gsub(/\s*@img\((.*)\)\s*/) { "" }. + gsub(/\s*@\/img\s*/, ""). + gsub(/\s*@(\w+)\s*/) { "<" + $1 + ">" }. + gsub(/\s*@\/(\w+)\s*/) { "" }. + gsub(/&at;/, "@") + doc += "\n" + end + + end + + doc += "

\n" + + end + +end + +class Scope < DocItem + + def initialize(block) + super(block) + @items = {} + end + + def add_doc_item(block) + item = DocItem::new(block) + @items[item.name] = item + end + + alias :super_produce_doc :produce_doc + + def produce_doc + + doc = < + + + + + +HEAD + + doc += "\n" + doc += "" + escape(self.brief) + "\n" + doc += "\n" + + doc += super_produce_doc + + doc += "\n" + + @items.keys.sort.each do |item_key| + + item = @items[item_key] + + item.name || raise("Missing @name for item #{item_key}") + item.brief || raise("Missing @brief for item #{item_key}") + + doc += "

\"" + escape(item.name) + "\" - " + escape(item.brief) + "

\n" + doc += "\n" + doc += "" + if ! item.synopsis.empty? + doc += "

Usage:

\n" + doc += "
    \n" + item.synopsis.each do |s| + doc += "
  • " + escape(s) + "
  • \n" + end + doc += "
\n" + end + + doc += item.produce_doc + + end + + doc += "
\n" + + doc + + end + +end + +class Collector + + def add_block(block) + + if block.find { |l| l =~ /^@scope/ } + + # is a scope block + @scopes ||= {} + @current_scope = Scope::new(block) + @scopes[@current_scope.name] = @current_scope + + else + @current_scope && @current_scope.add_doc_item(block) + end + + end + + def produce_doc + + @scopes.keys.sort.each do |k| + suffix = k.downcase + outfile = $outfiles + "/" + $loc + "_" + suffix + ".xml" + File.open(outfile, "w") do |file| + file.write(@scopes[k].produce_doc) + puts "---> #{outfile} written." + end + end + + end + + def produce_index + + outfile = $outfiles + "/" + $loc + ".xml" + File.open(outfile, "w") do |file| + + doc = < + + + + + +HEAD + + doc += "\n" + + doc += "#{escape($title)}\n" + + doc += "\n" + + @scopes.keys.sort.each do |k| + suffix = k.downcase + doc += "\n" + end + + doc += "\n" + doc += "\n" + + file.write(doc) + + end + + puts "---> Index file #{outfile} written." + + end + +end + +collector = Collector::new + +File.open($infile, "r") do |file| + + block = nil + + file.each_line do |l| + l = unescape(l) + if l =~ /^\s*#\s*#{$key}/ + block = [] + elsif l =~ /^\s*#\s*(.*)\s*$/ + block && block.push($1) + elsif l =~ /^\s*$/ + block && collector.add_block(block) + block = nil + end + + end + +end + +collector.produce_doc +collector.produce_index + diff --git a/scripts/klayoutrc_drc_samples b/scripts/klayoutrc_drc_samples new file mode 100644 index 000000000..e00122048 --- /dev/null +++ b/scripts/klayoutrc_drc_samples @@ -0,0 +1,251 @@ + + + false + false + 10 + true + #000000 + true + 1 + by-name + auto + 50 + false + false + + any-top + 1000 + 1 + fit-marker + + 0.001 + 0 + 32 + false + 255,157,157[0] 255,128,168[1] 192,128,255[2] 149,128,255[3] 128,134,255[4] 128,168,255[5] 255,0,0[6] 255,0,128[7] 255,0,255[8] 128,0,255[9] 0,0,255[10] 0,128,255[11] 128,0,0[12] 128,0,87[13] 128,0,128[14] 80,0,128[15] 0,0,128[16] 0,64,128[17] 128,255,251[18] 128,255,141[19] 175,255,128[20] 243,255,128[21] 255,194,128[22] 255,160,128[23] 0,255,255[24] 1,255,107[25] 145,255,0[26] 221,255,0[27] 255,174,0[28] 255,128,0[29] 0,128,128[30] 0,128,80[31] 0,128,0[32] 80,128,0[33] 128,128,0[34] 128,80,0[35] 255,255,255 192,192,192 128,128,128 96,96,96 64,64,64 0,0,0 + add + auto + 50 + false + 0 + + 0.001 + false + file='/home/matthias/klayout/trunk/build.linux-32-gcc-release/main/x.def';lef-files='0.lef','1.lef';import-mode=0; + false + 0 + 1,0.1,0.01,0.005,0.001 + + 0.1 + false + false + false + false + false + 2 + 5 + false + 2 + false + 0 + 10 + 100 + 0.001 + false + 0 + 0 + false + 100 + 1 + any + global + 0 + false + CIRCLE + 0 + 0 + 1 + Basic + false + layer:[layer:];radius:##0.1;handle:[dpoint:-0.1,0];npoints:#64;actual_radius:##0.1; + false + 0 + 0 + 1 + 1 + 1000 + false + any + flush + 0.0 + 0.0 + 0.1 + true + false + left + 0 + ABC + bottom + false + true + false + false + true + true + 1 + LIB + 32000 + 8000 + false + true + r0 *1 0,0 + #404040 + 0.1 + true + lines + dots + tenths-dotted-lines + true + false + 1 + + auto + 0 + true + true + '@@navigator_menu.navigator_main_menu.navigator_all_hier_levels':'';'@@navigator_menu.navigator_main_menu.navigator_freeze':'';'@@navigator_menu.navigator_main_menu.navigator_show_images':'';'@hcp_context_menu.copy':'';'@hcp_context_menu.cut':'';'@hcp_context_menu.delete_cell':'';'@hcp_context_menu.flat_mode':'';'@hcp_context_menu.flatten_cell':'';'@hcp_context_menu.hide_cell':'';'@hcp_context_menu.new_cell':'';'@hcp_context_menu.open_current':'';'@hcp_context_menu.paste':'';'@hcp_context_menu.rename_cell':'';'@hcp_context_menu.replace_cell':'';'@hcp_context_menu.save_cell_as':'';'@hcp_context_menu.show_all':'';'@hcp_context_menu.show_as_top':'';'@hcp_context_menu.show_cell':'';'@hcp_context_menu.sorting.by_area':'';'@hcp_context_menu.sorting.by_name':'';'@lcp_context_menu.add_others':'';'@lcp_context_menu.clean_up':'';'@lcp_context_menu.copy':'';'@lcp_context_menu.cut':'';'@lcp_context_menu.del':'';'@lcp_context_menu.group':'';'@lcp_context_menu.hide':'';'@lcp_context_menu.hide_all':'';'@lcp_context_menu.hide_empty_layers':'';'@lcp_context_menu.insert':'';'@lcp_context_menu.paste':'';'@lcp_context_menu.regroup_menu.flatten':'';'@lcp_context_menu.regroup_menu.grp_d':'';'@lcp_context_menu.regroup_menu.grp_i':'';'@lcp_context_menu.regroup_menu.grp_l':'';'@lcp_context_menu.rename':'';'@lcp_context_menu.select_all':'';'@lcp_context_menu.select_source':'';'@lcp_context_menu.show':'';'@lcp_context_menu.show_all':'';'@lcp_context_menu.show_only':'';'@lcp_context_menu.sort_menu.sort_dli':'';'@lcp_context_menu.sort_menu.sort_idl':'';'@lcp_context_menu.sort_menu.sort_ild':'';'@lcp_context_menu.sort_menu.sort_ldi':'';'@lcp_context_menu.sort_menu.sort_name':'';'@lcp_context_menu.tab_menu.new_tab':'';'@lcp_context_menu.tab_menu.remove_tab':'';'@lcp_context_menu.tab_menu.rename_tab':'';'@lcp_context_menu.test_shapes_in_view':'';'@lcp_context_menu.ungroup':'';'@lcp_tabs_context_menu.new_tab':'';'@lcp_tabs_context_menu.remove_tab':'';'@lcp_tabs_context_menu.rename_tab':'';'@toolbar.box':'';'@toolbar.combine_mode':'';'@toolbar.instance':'';'@toolbar.move':'';'@toolbar.partial':'';'@toolbar.path':'';'@toolbar.polygon':'';'@toolbar.ruler':'';'@toolbar.select':'';'@toolbar.text':'';bookmark_menu.bookmark_view:'';bookmark_menu.load_bookmarks:'';bookmark_menu.manage_bookmarks:'';bookmark_menu.save_bookmarks:'';edit_menu.add_image:'';edit_menu.cancel:Esc;edit_menu.cell_menu.adjust_cell_origin:'';edit_menu.cell_menu.delete_cell:'';edit_menu.cell_menu.flatten_cell:'';edit_menu.cell_menu.new_cell:'';edit_menu.cell_menu.rename_cell:'';edit_menu.cell_menu.replace_cell:'';edit_menu.clear_all_rulers:'Ctrl+K';edit_menu.configure_rulers:'';edit_menu.copy:'Ctrl+C';edit_menu.cut:'Ctrl+X';edit_menu.delete:Del;edit_menu.duplicate:'Ctrl+B';edit_menu.edit_options:F3;edit_menu.image_menu.bring_to_back:'';edit_menu.image_menu.bring_to_front:'';edit_menu.image_menu.clear_all_images:'';edit_menu.layer_menu.boolean:'';edit_menu.layer_menu.clear_layer:'';edit_menu.layer_menu.copy_layer:'';edit_menu.layer_menu.delete_layer:'';edit_menu.layer_menu.edit_layer:'';edit_menu.layer_menu.merge:'';edit_menu.layer_menu.new_layer:'';edit_menu.layer_menu.size:'';edit_menu.mode_menu.box:'';edit_menu.mode_menu.instance:'';edit_menu.mode_menu.move:'';edit_menu.mode_menu.partial:'';edit_menu.mode_menu.path:'';edit_menu.mode_menu.polygon:'';edit_menu.mode_menu.ruler:'';edit_menu.mode_menu.select:'';edit_menu.mode_menu.text:'';edit_menu.paste:'Ctrl+V';edit_menu.redo:'Ctrl+Y';edit_menu.select_menu.disable_all:'';edit_menu.select_menu.enable_all:'';edit_menu.select_menu.pi_enable_1:'';edit_menu.select_menu.pi_enable_15:'';edit_menu.select_menu.pi_enable_2:'';edit_menu.select_menu.pi_enable_3:'';edit_menu.select_menu.pi_enable_4:'';edit_menu.select_menu.pi_enable_5:'';edit_menu.select_menu.pi_enable_6:'';edit_menu.select_menu.pi_enable_8:'';edit_menu.select_menu.select_all:'';edit_menu.select_menu.unselect_all:'';edit_menu.selection_menu.align:'';edit_menu.selection_menu.change_layer:'';edit_menu.selection_menu.convert_to_pcell:'';edit_menu.selection_menu.difference:'';edit_menu.selection_menu.flatten_insts:'';edit_menu.selection_menu.intersection:'';edit_menu.selection_menu.macro_in_menu_5:'';edit_menu.selection_menu.make_array:'';edit_menu.selection_menu.make_cell:'';edit_menu.selection_menu.make_cell_variants:'';edit_menu.selection_menu.move_hier_up:'';edit_menu.selection_menu.round_corners:'';edit_menu.selection_menu.sel_flip_x:'';edit_menu.selection_menu.sel_flip_y:'';edit_menu.selection_menu.sel_free_rot:'';edit_menu.selection_menu.sel_move:'';edit_menu.selection_menu.sel_rot_ccw:'';edit_menu.selection_menu.sel_rot_cw:'';edit_menu.selection_menu.sel_scale:'';edit_menu.selection_menu.size:'';edit_menu.selection_menu.union:'';edit_menu.show_properties:Q;edit_menu.undo:'Ctrl+Z';edit_menu.utils_menu.clip_tool:'';edit_menu.utils_menu.fill_tool:'';file_menu.clone:'';file_menu.close:'Ctrl+W';file_menu.exit:'Ctrl+Q';file_menu.import_menu.import_def:'';file_menu.import_menu.import_gerber_menu.import_gerber_new:'';file_menu.import_menu.import_gerber_menu.import_gerber_new_free:'';file_menu.import_menu.import_gerber_menu.import_gerber_open:'';file_menu.import_menu.import_gerber_menu.import_gerber_recent:'';file_menu.import_menu.import_lef:'';file_menu.import_menu.import_stream:'';file_menu.layout_props:'';file_menu.layout_stats:'';file_menu.load_layer_props:'';file_menu.macro_in_menu_4:'';file_menu.macro_in_menu_6:'';file_menu.new_layout:'';file_menu.new_panel:'';file_menu.open:'';file_menu.open_new_panel:'Ctrl+O';file_menu.open_same_panel:'Ctrl+Shift+O';file_menu.print:'Ctrl+P';file_menu.pull_in:'';file_menu.reader_options:'';file_menu.reload:'Ctrl+R';file_menu.restore_session:'';file_menu.save:'';file_menu.save_as:'';file_menu.save_layer_props:'';file_menu.save_session:'';file_menu.screenshot:Print;file_menu.setup:'';file_menu.view_log:'';help_menu.about:'';help_menu.about_qt:'';help_menu.assistant:'';help_menu.show_all_tips:'';tools_menu.browse_instances:'';tools_menu.browse_markers:'';tools_menu.browse_shapes:'';tools_menu.macro_development:F5;tools_menu.macros.macro_in_menu_1:'';tools_menu.macros.macro_in_menu_2:'';tools_menu.macros.macro_in_menu_3:'';tools_menu.net_trace:'';tools_menu.technologies:'';tools_menu.verification.diff_tool:'';tools_menu.verification.shapes_to_markers.scan_layers:'';tools_menu.verification.shapes_to_markers.scan_layers_flat:'';tools_menu.verification.xor_tool:'';tools_menu.xsection_script_submenu.xsection_script_load:'';tools_menu.xsection_script_submenu.xsection_script_mru1:'';tools_menu.xsection_script_submenu.xsection_script_mru2:'';tools_menu.xsection_script_submenu.xsection_script_mru3:'';tools_menu.xsection_script_submenu.xsection_script_mru4:'';view_menu.default_grid.default_grid_1:'';view_menu.default_grid.default_grid_2:'';view_menu.default_grid.default_grid_3:'';view_menu.edit_top_level_selection:'';view_menu.no_stipples:'';view_menu.show_cell_boxes:'';view_menu.show_grid:'';view_menu.show_hierarchy_panel:'';view_menu.show_layer_panel:'';view_menu.show_layer_toolbox:'';view_menu.show_navigator:'';view_menu.show_texts:'';view_menu.show_toolbar:'';view_menu.synchronized_views:'';view_menu.transient_selection:'';zoom_menu.ascend:'Ctrl+A';zoom_menu.dec_max_hier:'-';zoom_menu.descend:'Ctrl+D';zoom_menu.global_trans.m0:'';zoom_menu.global_trans.m135:'';zoom_menu.global_trans.m45:'';zoom_menu.global_trans.m90:'';zoom_menu.global_trans.r0:'';zoom_menu.global_trans.r180:'';zoom_menu.global_trans.r270:'';zoom_menu.global_trans.r90:'';zoom_menu.goto_position:'Ctrl+G';zoom_menu.inc_max_hier:'+';zoom_menu.last_display_state:'Shift+Tab';zoom_menu.max_hier:'*';zoom_menu.max_hier_0:'0';zoom_menu.max_hier_1:'1';zoom_menu.next_display_state:Tab;zoom_menu.redraw:'';zoom_menu.select_cell:'';zoom_menu.select_current_cell:'Ctrl+S';zoom_menu.synchronized_views:'';zoom_menu.zoom_fit:F2;zoom_menu.zoom_fit_sel:'Shift+F2';zoom_menu.zoom_in:Return;zoom_menu.zoom_out:'Shift+Return';file_menu.macro_in_menu_7:'';tools_menu.cell_stat:'';tools_menu.processing_script_submenu.processing_script_load:'';tools_menu.processing_script_submenu.processing_script_mru1:'';tools_menu.processing_script_submenu.processing_script_mru2:'';tools_menu.processing_script_submenu.processing_script_mru3:'';file_menu.macro_in_menu_8:'';tools_menu.macros.macro_in_menu_7:'';tools_menu.processing_script_submenu.processing_script_mru4:'';view_menu.default_grid.default_grid_4:'';view_menu.default_grid.default_grid_5:'' + false + true + false + + 'a = RBA::Edges.new';'a.insert(RBA::Edge::new(0, 0, 100, 0))';'b.insert(RBA::Edge::new(90, 0, 200, 0))';'b.clear';'b = RBA::Edges.new';'b.insert(RBA::Edge::new(100, 0, 200, 0))';'a&b';'e.insert(RBA::Edge::new)';'e.extends(10, 10, 10, 10)';'e.extended(10, 10, 10, 10)';'e.insert(RBA::Edge::new(1, 100, 1, 200))';'e.clear';'e.insert(RBA::Edge::new(1, 100, 1, 100))';'e = RBA::Edges::new';'e.insert(RBA::Edge::new(1, 100, 1, 200))';'e.extended(10, 10, 10, 10, false)';'b';'(1..18).inspect';'(1..18).methods';'(1..18).first';'(1..18).second';'(1..18).last';'(..18).last';'(nil..18).last';'(1..18).last';'{1=>2}.is_a?(Hash)';'lm = RBA::LayerMap::new';'lm.map("hallo", 0)';'lm.is_mapped?(RBA::LayerInfo::new("x"))';'lm.is_mapped?(RBA::LayerInfo::new("hallo"))';'lm.is_mapped?(RBA::LayerInfo::new("halloas"))';'lm.is_mapped?(RBA::LayerInfo::new("hallo (1/0)"))';'lm.is_mapped?(RBA::LayerInfo::new("hallo"))';'lm.is_mapped?(RBA::LayerInfo::new(1, 0, "hallo"))';'lm.is_mapped?(RBA::LayerInfo::from_string("hallo"))';'lm.is_mapped?(RBA::LayerInfo::from_string("hallo (1/0)"))';'lm.is_mapped?(RBA::LayerInfo::from_string("hallo (10/0)"))';'lm.is_mapped?(RBA::LayerInfo::from_string("hillo (10/0)"))';'%qw(& aber)';'%qw("&" aber)';'%w("&" aber)';'%w(& aber)';'RBA::LayoutView::current';'RBA::LayoutView::current.inspect';'[1,2].collect { |x| x+1 }';'RBA::Box(0, 0, 10, 20)*0.5';'RBA::Box::new(0, 0, 10, 20)*0.5';'nil..15';'nil..nil';'0..15';'0..15.class';'(0..15).class';'c';'l2';'l2.data.class';'l1';'l2.enclosing(l1.400.nm)';'l2.enclosing(l1,400.nm)';'File::basename("hallo/file.x")';'File::basename("hallo/file.x", "x")';'File::basename("hallo/file.x", ".x")';'File::basename("hallo/file.x", File::suffix("file.x"))';'File::basename("hallo/file.x", File::extension("file.x"))';'File::basename("hallo/file.x", File::ext("file.x"))';'File::basename("hallo/file.x")';'0..1.inspect';'(0..1).inspect';'(0..1).first';'(0..1).second';'(0..1).min';'(0..1).max';'(0.5..17.3).min';'a=1';'++a';'a';'a++';'a+=1';'RBA::Logger::info("hallo")';'RBA::Logger::info("hallo")';'RBA::Logger::error("Nochwas")';'RBA::Logger::error("hallo\\nanother line")';'RBA::Logger::error("hallo")';'RBA::Logger::info("hallo")';'caller';'data';'args';'aa';'method';'@data';'l1';'l1.data';'l2.data';'ly = RBA::CellView::active_cellview.layout';'ly = RBA::CellView::active.layout';'lv = RBA::LayoutView::current';'sel = nil';'lv.each_object_selected { |s| sel = s.shape }';'sel';'sel.each_point { |p| puts p }';'pts = []; sel.each_point { |p| pts.push(p) }';'RBA::Path::new(pts, sel.path_width)';'pts = []; sel.each_point { |p| pts.push(p*2) }';'pts';'sel.path = RBA::Path::new(pts, sel.path_width)';'sel.box = RBA::Box::new(0, 0, 100, 100)';'lv.cancel';'lv.begin_transaction("hallo")';'lv.transaction("hallo")';'lv.commit';'ly = RBA::CellView::active.layout';'ly.layer_indices';'ly.layer_indices.find { |li| info = ly.get_info(li); info.layer == 17 && info.datatype == 0 }';'ly.layer_indices.find { |li| info = ly.get_info(li); info.layer == 16 && info.datatype == 0 }';'[1,2,3][-1]';'[1,2,3].each_with_index do |x,i| puts x; end';'[1,2,3].each_with_index do |x,i| puts i; end';'[1,2,3].each_with_index do |x,i| puts x; end';'[1,2,3].each_with_index do |x,i| puts i; end';'a = 17; 5.times { a += 1; }; a';'a = 17; 5.times { a = 5; }; a';'args = [1, 2, 3]';'args.size.times.collect { |i| "a#{i}" }.join(", ")';'def f(x); puts x.to_s; end';'f(RBA::Box)';'method';'data';'@new_layers';'av';'method' + DejaVu Sans Mono + 11 + 2 + false + true + basic:'Alert'=(bold:true,color:'#bf0303',background:'#f7e7e7'),'Base-N Integer'=(color:'#b07e00'),'Character'=(color:'#ff80e0'),'Comment'=(italic:true,color:'#888786'),'Data Type'=(color:'#0057ae'),'Decimal/Value'=(color:'#b07e00'),'Error'=(color:'#bf0303'),'Floating Point'=(color:'#b07e00'),'Function'=(color:'#442886'),'Keyword'=(bold:true),'Normal'=(),'Others'=(color:'#006e26'),'Region Marker'=(color:'#0057ae',background:'#e1eaf8'),'String'=(color:'#bf0303');ruby:'Access Control'=(color:'#0000ff'),'Alert'=(),'Attribute Definition'=(),'Bin'=(),'Blockcomment'=(),'Char'=(),'Class Variable'=(),'Command'=(color:'#aa3000'),'Comment'=(),'Constant'=(),'Constant Value'=(color:'#bb1188'),'Data'=(),'Dec'=(),'Default globals'=(bold:true,color:'#c00000'),'Definition'=(),'Delimiter'=(color:'#ff9fec'),'Error'=(),'Expression'=(),'Float'=(),'GDL input'=(),'Global Constant'=(bold:true,color:'#bb1188'),'Global Variable'=(color:'#c00000'),'Here Document'=(),'Hex'=(),'Instance Variable'=(),'Kernel methods'=(color:'#000080'),'Keyword'=(),'Member'=(),'Message'=(color:'#4000a7'),'Normal Text'=(),'Octal'=(),'Operator'=(color:'#ff9fec'),'Pseudo variable'=(),'RDoc Value'=(),'Raw String'=(color:'#dd4a4a'),'Region Marker'=(color:'#0000ff'),'Regular Expression'=(color:'#4a5704'),'String'=(),'Substitution'=(),'Symbol'=(color:'#d40000'); + 8 + MacroEditorDialog="AdnQywABAAAAAACDAAAAGAAABigAAAQBAAAAhAAAADQAAAYnAAAEAAAAAAAAAA==";splitter="AAAA/wAAAAAAAAADAAAC3gAAAHsAAACJAQAAAAYBAAAAAg==";mainHSplitter="AAAA/wAAAAAAAAACAAAAzAAAA9IBAAAABgEAAAAB";splitter_7="AAAA/wAAAAAAAAABAAAAewAAAAAGAQAAAAE=";macroTree="AAAA/wAAAAAAAAABAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAMoAAAABAQEAAQAAAAAAAAAAAAAAAGT/////AAAAgQAAAAAAAAABAAAAygAAAAEAAAAA"; + 16 + 0 + '/home/matthias/klayout/trunk/testdata_private/cif/t3b_au.gds.gz'@'MOS' '/home/matthias/klayout/trunk/testdata_private/cif/t2.cif.gz' '/home/matthias/klayout/trunk/testdata_private/cif/t2_au.gds.gz' '/home/matthias/klayout/trunk/build.linux-32-gcc-debug/main/drc.gds' '/home/matthias/private/klayout/designs/mosis/mTSMd025DL.gds.gz'@'MOS' '/home/matthias/klayout/trunk/build.linux-32-gcc-release/main/xx.gds' '/home/matthias/klayout/trunk/build.linux-32-gcc-release/main/xx.dxf' '/home/matthias/klayout/trunk/build.linux-32-gcc-release/main/TOP$1.dxf' '/home/matthias/klayout/trunk/build.linux-32-gcc-release/main/x.gds' '/home/matthias/klayout/trunk/build.linux-32-gcc-release/main/drctest2.gds' + false + true + false + auto + -1 + -1 + 50 + -1 + -1 + 10000 + 1 + fit-net + 2 + false + false + 0.15 + + database-top + auto + 2 + -1 + 2 + -1 + 100000 + 1 + fit-marker + MarkerBrowserDialog="AdnQywABAAAAAAHCAAAAxgAABSAAAAN+AAABwwAAAOIAAAUfAAADfQAAAAAAAA==";splitter_2="AAAA/wAAAAAAAAACAAABvAAAAYkBAAAABgEAAAAB";splitter="AAAA/wAAAAAAAAACAAAA9QAAAPcBAAAABgEAAAAC";markers_list="AAAA/wAAAAAAAAABAAAAAQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAYcAAAAEAQEAAQAAAAAAAAAABAAAAGQAAAAYAAAAgQAAAAMAAAAEAAAALwAAAAEAAAADAAAAKgAAAAEAAAADAAAANAAAAAEAAAADAAAA+gAAAAEAAAAD";directory_tree="AAAA/wAAAAAAAAABAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAboAAAACAQEAAQAAAAAAAAAAAAAAAGT/////AAAAgQAAAAAAAAACAAAA5AAAAAEAAAAAAAAA1gAAAAEAAAAA"; + true + true + true + + false + auto + false + true + true + any + 8 + title=Ruler,fmt=$D,fmt_x=$X,fmt_y=$Y,style=ruler,outline=diag,snap=true,angle_constraint=global + -1 + auto + 1 + true + 1 + true + 3 + + any-top + 1000 + 1000 + 1 + fit-marker + BrowseShapesForm="AdnQywABAAAAAAAAAAAAGAAAA/cAAAIuAAAAAQAAADQAAAP2AAACLQAAAAAAAA==";splitter="AAAA/wAAAAAAAAADAAABCAAAAQgAAAEIAQAAAAYBAAAAAQ==";lv_cell_instance="AAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUEAAAACAQAAAQAAAAAAAAAAAAAAAGT/////AAAAgQAAAAAAAAACAAAAZAAAAAEAAAAAAAAA3QAAAAEAAAAA";lv_shape_instance="AAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATIAAAABAQAAAQAAAAAAAAAAAAAAAGT/////AAAAgQAAAAAAAAABAAABMgAAAAEAAAAA";lv_cell="AAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUEAAAADAQAAAQAAAAAAAAAAAAAAAGT/////AAAAgQAAAAAAAAACAAAAyAAAAAIAAAAAAAAAeQAAAAEAAAAA"; + true + true + true + false + false + true + true + 0 1 2 3 4 5[1] 6 7 8 9[0] 10 11 12 13 14 15 + + false + ''('(Default)'):(connectivity:(15/0,16/0,17/0;17/0,18/0,19/0;1/0,17/0,20/0;);); + <?xml version="1.0" encoding="utf-8"?> +<technologies> + <technology> + <name/> + <description>(Default)</description> + <base-path/> + <layer-properties_file/> + <layer-map/> + <lef-def-import> + <read-all-layers>true</read-all-layers> + <layer-map/> + <produce-net-names>true</produce-net-names> + <net-property-name>#1</net-property-name> + <produce-cell-outlines>true</produce-cell-outlines> + <cell-outline-layer>OUTLINE</cell-outline-layer> + <produce-via-geometry>true</produce-via-geometry> + <via-geometry-suffix/> + <via-geometry-datatype>0</via-geometry-datatype> + <produce-pins>true</produce-pins> + <pins-suffix>.PIN</pins-suffix> + <pins-datatype>2</pins-datatype> + <produce-obstructions>true</produce-obstructions> + <obstructions-suffix>.OBS</obstructions-suffix> + <obstructions-datatype>3</obstructions-datatype> + <produce-labels>true</produce-labels> + <labels-suffix>.LABEL</labels-suffix> + <labels-datatype>1</labels-datatype> + <produce-routing>true</produce-routing> + <routing-suffix/> + <routing-datatype>0</routing-datatype> + </lef-def-import> + <connectivity> + </connectivity> + </technology> +</technologies> + + false + auto + 0 + true + true + + AdnQywABAAAAAAF/AAAAGwAABWMAAAJBAAABgAAAADcAAAViAAACQAAAAAAAAA== + AAAA/wAAAAD9AAAAAgAAAAAAAADzAAABovwCAAAAAvsAAAAqAG4AYQB2AGkAZwBhAHQAbwByAF8AZABvAGMAawBfAHcAaQBkAGcAZQB0AAAAAAD/////AAAAlQD////7AAAAHABoAHAAXwBkAG8AYwBrAF8AdwBpAGQAZwBlAHQBAAAAUgAAAaIAAAAZAP///wAAAAEAAAExAAABovwCAAAAAvsAAAAcAGwAcABfAGQAbwBjAGsAXwB3AGkAZABnAGUAdAEAAABSAAABFwAAABkA////+wAAABwAbAB0AF8AZABvAGMAawBfAHcAaQBkAGcAZQB0AQAAAW8AAACFAAAAhQAAAIUAAAGzAAABogAAAAQAAAAEAAAACAAAAAj8AAAAAQAAAAIAAAABAAAADgB0AG8AbwBsAGIAYQByAQAAAAD/////AAAAAAAAAAA= + false + true + false + all + + 1 + rdb + false + + + diff --git a/scripts/make_drc_doc.sh b/scripts/make_drc_doc.sh new file mode 100755 index 000000000..c03fcc593 --- /dev/null +++ b/scripts/make_drc_doc.sh @@ -0,0 +1,14 @@ +#!/bin/sh -e + +inst=$(realpath $(dirname $0)) +ld=$(realpath .) + +bin="$ld/klayout" + +export LD_LIBRARY_PATH=$ld + +cd $inst/.. + +$bin -z -r $inst/create_drc_samples.rb -t -c $inst/klayoutrc_drc_samples +$inst/extract_doc.rb + diff --git a/src/lay/built_in_macros/drc.lym b/src/lay/built_in_macros/drc.lym index e6baff795..0326a53c5 100644 --- a/src/lay/built_in_macros/drc.lym +++ b/src/lay/built_in_macros/drc.lym @@ -805,16 +805,16 @@ CODE # @name texts # @brief Selects texts from an original layer # @synopsis layer.texts - # @synopsis layer.texts(text) - # @synopsis layer.texts(text, true) - # @synopsis layer.texts(text, false) + # @synopsis layer.texts(pattern) + # @synopsis layer.texts(pattern, true) + # @synopsis layer.texts(string, false) # This method can be applied to original layers - i.e. ones that have # been created with \input. It will produce a small box (2x2 DBU) on each - # selected texts. + # selected text. # - # Texts can be selected either by exact match or pattern match with a + # Texts can be selected either by exact match string or a pattern match with a # glob-style pattern. The second argument selects pattern style (true) - # or exact match (false). + # or exact match (false). The default is pattern match. # # @code # # Selects all texts @@ -2666,17 +2666,18 @@ CODE # %DRC% # @name output - # @brief Output the content of the layer + # @brief Outputs the content of the layer # @synopsis layer.output(specs) # - # This method will output the content of the layer to the specified output. + # This method will copy the content of the layer to the specified output. # # If a report database is selected for the output, the specification has to include a # category name and optionally a category description. # # If the layout is selected for the output, the specification can consist of # one to three parameters: a layer number, a data type (optional, default is 0) - # and a layer name (optional). + # and a layer name (optional). Alternatively, the output can be specified by + # a single RBA::LayerInfo object. # # See \global#report and \global#target on how to configure output to a target layout # or report database. @@ -2987,10 +2988,12 @@ CODE # @brief Specifies input from a source # @synopsis source.input(layer) # @synopsis source.input(layer, datatype) + # @synopsis source.input(layer_into) # @synopsis source.input(filter, ...) # Creates a layer with the shapes from the given layer of the source. - # The layer can be specified by layer and optionally datatype or by - # a sequence of filters. Filters are expressions describing ranges + # The layer can be specified by layer and optionally datatype, by a RBA::LayerInfo + # object or by a sequence of filters. + # Filters are expressions describing ranges # of layers and/or datatype numbers or layer names. Multiple filters # can be given and all layers matching at least one of these filter # expressions are joined to render the input layer for the DRC engine. @@ -3015,6 +3018,11 @@ CODE li && layers.push(li) li && @tmp_layers.push(li) + elsif (args.size == 1 && args[0].is_a?(RBA::LayerInfo)) + + li = @layout.find_layer(args[0]) + li && layers.push(li) + elsif (args.size == 1 || args.size == 2) && args[0].is_a?(1.class) li = @layout.find_layer(args[0], args[1] || 0) @@ -3041,6 +3049,31 @@ CODE end + # %DRC% + # @name layers + # @brief Gets the layers the source contains + # @synopsis source.layers + # Delivers a list of RBA::LayerInfo objects representing the layers + # inside the source. + # + # One application is to read all layers from a source. In the following + # example, the "and" operation is used to perform a clip with the given + # rectangle. Note that this solution is not efficient - it's provided + # as an example only: + # + # @code + # output_cell("Clipped") + # + # clip_box = polygon_layer + # clip_box.insert(box(0.um, -4.um, 4.um, 0.um)) + # + # layers.each { |l| (input(l) & clip_box).output(l) } + # @/code + + def layers + @layout.layer_indices.collect { |li| @layout.get_info(li) } + end + end # The DRC engine @@ -3772,6 +3805,16 @@ CODE layer.output(*args) end + # %DRC% + # @name layers + # @brief Gets the layers contained in the default source + # @synopsis layers + # See \Source#layers for a description of that function. + + def layers + layout.layers + end + # %DRC% # @name cell # @brief Selects a cell for input on the default source @@ -4172,6 +4215,8 @@ CODE if args.size == 1 if args[0].is_a?(1.class) info = RBA::LayerInfo::new(args[0], 0) + elsif args[0].is_a?(RBA::LayerInfo) + info = args[0] elsif args[0].is_a?(String) info = RBA::LayerInfo::from_string(args[0]) else diff --git a/src/lay/doc/about/drc_ref.xml b/src/lay/doc/about/drc_ref.xml index c872eef71..c4b5997e0 100644 --- a/src/lay/doc/about/drc_ref.xml +++ b/src/lay/doc/about/drc_ref.xml @@ -1,7 +1,7 @@ - + diff --git a/src/lay/doc/about/drc_ref_global.xml b/src/lay/doc/about/drc_ref_global.xml index 07156769e..067afa587 100644 --- a/src/lay/doc/about/drc_ref_global.xml +++ b/src/lay/doc/about/drc_ref_global.xml @@ -1,7 +1,7 @@ - + @@ -152,6 +152,15 @@ See Source#input for a description +

"layers" - Gets the layers contained in the default source

+ +

Usage:

+
    +
  • layers
  • +
+

+See Source#layers for a description of that function. +

"layout" - Specifies an additional layout for the input source.

Usage:

@@ -339,7 +348,7 @@ is used as input.
  • A string "@n" specifying input from a layout in the current panel
  • A layout filename plus an optional cell name
  • -
  • A Layout object
  • +
  • A Layout object plus an optional cell name
  • A Cell object

diff --git a/src/lay/doc/about/drc_ref_layer.xml b/src/lay/doc/about/drc_ref_layer.xml index fda5767d3..807453917 100644 --- a/src/lay/doc/about/drc_ref_layer.xml +++ b/src/lay/doc/about/drc_ref_layer.xml @@ -1,7 +1,7 @@ - + @@ -960,21 +960,22 @@ on polygons and egdes (layer1: red, layer2: blue):

-

"output" - Output the content of the layer

+

"output" - Outputs the content of the layer

Usage:

  • layer.output(specs)

-This method will output the content of the layer to the specified output. +This method will copy the content of the layer to the specified output.

If a report database is selected for the output, the specification has to include a category name and optionally a category description.

If the layout is selected for the output, the specification can consist of one to three parameters: a layer number, a data type (optional, default is 0) -and a layer name (optional). +and a layer name (optional). Alternatively, the output can be specified by +a single LayerInfo object.

See global#report and global#target on how to configure output to a target layout or report database. @@ -1211,6 +1212,9 @@ The circles are approximated by polygons. "n" segments are used to approximate a

This method return a layer wit the modified polygons. Merged semantics applies for this method (see raw and clean). +If used with tiling, the rounded_corners function may render invalid results because +in tiling mode, not the whole merged region may be captured. In that case, inner +edges may appear as outer ones and their corners will receive rounding.

The following image shows the effect of the "rounded_corners" method. The upper ends of the vertical bars are rounded with a smaller radius automatically because their width does not allow @@ -1499,6 +1503,20 @@ The following images show the effect of various forms of the "sized" method:

+

"smoothed" - Smoothes the polygons of the region

+ +

Usage:

+
    +
  • layer.smoothed(d)
  • +
+

+"Smoothing" returns a simplified version of the polygons. Simplification is +achieved by removing vertices unless the resulting polygon deviates by more +than the given distance d from the original polygon. +

+This method return a layer wit the modified polygons. Merged semantics applies for this +method (see raw and clean). +

"snap" - Brings each vertex on the given grid (g or gx/gy for x or y direction)

Usage:

@@ -1614,6 +1632,34 @@ See
strict for a discussion of strict handling.

This feature has been introduced in version 0.23.2.

+

"texts" - Selects texts from an original layer

+ +

Usage:

+
    +
  • layer.texts
  • +
  • layer.texts(pattern)
  • +
  • layer.texts(pattern, true)
  • +
  • layer.texts(string, false)
  • +
+

+This method can be applied to original layers - i.e. ones that have +been created with input. It will produce a small box (2x2 DBU) on each +selected text. +

+Texts can be selected either by exact match string or a pattern match with a +glob-style pattern. The second argument selects pattern style (true) +or exact match (false). The default is pattern match. +

+

+# Selects all texts
+t = input(1, 0).texts
+# Selects all texts beginning with an "A"
+t = input(1, 0).texts("A*")
+t = input(1, 0).texts("A*", true)
+# Selects all texts whose string is "A*"
+t = input(1, 0).texts("A*", false)
+
+

"transform" - Transforms a layer (modifies the layer)

Usage:

diff --git a/src/lay/doc/about/drc_ref_source.xml b/src/lay/doc/about/drc_ref_source.xml index 6bd8305c8..a2d39a28f 100644 --- a/src/lay/doc/about/drc_ref_source.xml +++ b/src/lay/doc/about/drc_ref_source.xml @@ -1,7 +1,7 @@ - + @@ -73,12 +73,14 @@ inverse_1 = extent.sized(100.0) - input(1, 0)
  • source.input(layer)
  • source.input(layer, datatype)
  • +
  • source.input(layer_into)
  • source.input(filter, ...)

Creates a layer with the shapes from the given layer of the source. -The layer can be specified by layer and optionally datatype or by -a sequence of filters. Filters are expressions describing ranges +The layer can be specified by layer and optionally datatype, by a LayerInfo +object or by a sequence of filters. +Filters are expressions describing ranges of layers and/or datatype numbers or layer names. Multiple filters can be given and all layers matching at least one of these filter expressions are joined to render the input layer for the DRC engine. @@ -93,6 +95,30 @@ Some filter expressions are: not have names)

+

"layers" - Gets the layers the source contains

+ +

Usage:

+
    +
  • source.layers
  • +
+

+Delivers a list of LayerInfo objects representing the layers +inside the source. +

+One application is to read all layers from a source. In the following +example, the "and" operation is used to perform a clip with the given +rectangle. Note that this solution is not efficient - it's provided +as an example only: +

+

+output_cell("Clipped")
+
+clip_box = polygon_layer
+clip_box.insert(box(0.um, -4.um, 4.um, 0.um))
+
+layers.each { |l| (input(l) & clip_box).output(l) }
+
+

"layout" - Returns the Layout object associated with this source

Usage:

diff --git a/src/lay/doc/images/drc_and1.png b/src/lay/doc/images/drc_and1.png index 9ea749e22..5ca351b96 100644 Binary files a/src/lay/doc/images/drc_and1.png and b/src/lay/doc/images/drc_and1.png differ diff --git a/src/lay/doc/images/drc_extended1.png b/src/lay/doc/images/drc_extended1.png index c919d576f..782147773 100644 Binary files a/src/lay/doc/images/drc_extended1.png and b/src/lay/doc/images/drc_extended1.png differ diff --git a/src/lay/doc/images/drc_extended2.png b/src/lay/doc/images/drc_extended2.png index 1bb227e9a..74d0487cf 100644 Binary files a/src/lay/doc/images/drc_extended2.png and b/src/lay/doc/images/drc_extended2.png differ diff --git a/src/lay/doc/images/drc_extended3.png b/src/lay/doc/images/drc_extended3.png index 6f3983891..6eef1beef 100644 Binary files a/src/lay/doc/images/drc_extended3.png and b/src/lay/doc/images/drc_extended3.png differ diff --git a/src/lay/doc/images/drc_extended4.png b/src/lay/doc/images/drc_extended4.png index bfe992ca1..c9e8f2857 100644 Binary files a/src/lay/doc/images/drc_extended4.png and b/src/lay/doc/images/drc_extended4.png differ diff --git a/src/lay/doc/images/drc_extents1.png b/src/lay/doc/images/drc_extents1.png index fba7447aa..5831e11d3 100644 Binary files a/src/lay/doc/images/drc_extents1.png and b/src/lay/doc/images/drc_extents1.png differ diff --git a/src/lay/doc/images/drc_extents2.png b/src/lay/doc/images/drc_extents2.png index e42d9e5d3..5d19a7158 100644 Binary files a/src/lay/doc/images/drc_extents2.png and b/src/lay/doc/images/drc_extents2.png differ diff --git a/src/lay/doc/images/drc_holes.png b/src/lay/doc/images/drc_holes.png index e3f08ddff..90d5dffa3 100644 Binary files a/src/lay/doc/images/drc_holes.png and b/src/lay/doc/images/drc_holes.png differ diff --git a/src/lay/doc/images/drc_hulls.png b/src/lay/doc/images/drc_hulls.png index cb2e7d726..d5ec66b69 100644 Binary files a/src/lay/doc/images/drc_hulls.png and b/src/lay/doc/images/drc_hulls.png differ diff --git a/src/lay/doc/images/drc_in.png b/src/lay/doc/images/drc_in.png index 958166227..9acbcd7b4 100644 Binary files a/src/lay/doc/images/drc_in.png and b/src/lay/doc/images/drc_in.png differ diff --git a/src/lay/doc/images/drc_inside.png b/src/lay/doc/images/drc_inside.png index f7066b7ae..81cbd2cda 100644 Binary files a/src/lay/doc/images/drc_inside.png and b/src/lay/doc/images/drc_inside.png differ diff --git a/src/lay/doc/images/drc_interacting.png b/src/lay/doc/images/drc_interacting.png index 78e8bc476..17658e8f2 100644 Binary files a/src/lay/doc/images/drc_interacting.png and b/src/lay/doc/images/drc_interacting.png differ diff --git a/src/lay/doc/images/drc_join1.png b/src/lay/doc/images/drc_join1.png index f2a722e8d..bf958d35a 100644 Binary files a/src/lay/doc/images/drc_join1.png and b/src/lay/doc/images/drc_join1.png differ diff --git a/src/lay/doc/images/drc_merged1.png b/src/lay/doc/images/drc_merged1.png index 1005e3d30..2c9d19c87 100644 Binary files a/src/lay/doc/images/drc_merged1.png and b/src/lay/doc/images/drc_merged1.png differ diff --git a/src/lay/doc/images/drc_merged2.png b/src/lay/doc/images/drc_merged2.png index e60fb3060..18eb8573d 100644 Binary files a/src/lay/doc/images/drc_merged2.png and b/src/lay/doc/images/drc_merged2.png differ diff --git a/src/lay/doc/images/drc_merged3.png b/src/lay/doc/images/drc_merged3.png index 5e2590ecb..0373c29fa 100644 Binary files a/src/lay/doc/images/drc_merged3.png and b/src/lay/doc/images/drc_merged3.png differ diff --git a/src/lay/doc/images/drc_merged4.png b/src/lay/doc/images/drc_merged4.png index 8a0207a0c..44c2ce83c 100644 Binary files a/src/lay/doc/images/drc_merged4.png and b/src/lay/doc/images/drc_merged4.png differ diff --git a/src/lay/doc/images/drc_moved1.png b/src/lay/doc/images/drc_moved1.png index 7536a9088..b106aa9b9 100644 Binary files a/src/lay/doc/images/drc_moved1.png and b/src/lay/doc/images/drc_moved1.png differ diff --git a/src/lay/doc/images/drc_not1.png b/src/lay/doc/images/drc_not1.png index 3f6bd28d1..9cc18c1bc 100644 Binary files a/src/lay/doc/images/drc_not1.png and b/src/lay/doc/images/drc_not1.png differ diff --git a/src/lay/doc/images/drc_not_in.png b/src/lay/doc/images/drc_not_in.png index d1829a7be..8ae86749c 100644 Binary files a/src/lay/doc/images/drc_not_in.png and b/src/lay/doc/images/drc_not_in.png differ diff --git a/src/lay/doc/images/drc_not_inside.png b/src/lay/doc/images/drc_not_inside.png index ed735fdf2..be211e753 100644 Binary files a/src/lay/doc/images/drc_not_inside.png and b/src/lay/doc/images/drc_not_inside.png differ diff --git a/src/lay/doc/images/drc_not_interacting.png b/src/lay/doc/images/drc_not_interacting.png index 97ee23413..5dde3e070 100644 Binary files a/src/lay/doc/images/drc_not_interacting.png and b/src/lay/doc/images/drc_not_interacting.png differ diff --git a/src/lay/doc/images/drc_not_outside.png b/src/lay/doc/images/drc_not_outside.png index d46555108..a0ba05b16 100644 Binary files a/src/lay/doc/images/drc_not_outside.png and b/src/lay/doc/images/drc_not_outside.png differ diff --git a/src/lay/doc/images/drc_not_overlapping.png b/src/lay/doc/images/drc_not_overlapping.png index 95b70cf05..efe58063e 100644 Binary files a/src/lay/doc/images/drc_not_overlapping.png and b/src/lay/doc/images/drc_not_overlapping.png differ diff --git a/src/lay/doc/images/drc_or1.png b/src/lay/doc/images/drc_or1.png index 4a3f4fe30..d0365dfdc 100644 Binary files a/src/lay/doc/images/drc_or1.png and b/src/lay/doc/images/drc_or1.png differ diff --git a/src/lay/doc/images/drc_outside.png b/src/lay/doc/images/drc_outside.png index 15aa2a81e..9a57e05e5 100644 Binary files a/src/lay/doc/images/drc_outside.png and b/src/lay/doc/images/drc_outside.png differ diff --git a/src/lay/doc/images/drc_overlapping.png b/src/lay/doc/images/drc_overlapping.png index c645a190f..f629a5726 100644 Binary files a/src/lay/doc/images/drc_overlapping.png and b/src/lay/doc/images/drc_overlapping.png differ diff --git a/src/lay/doc/images/drc_raw1.png b/src/lay/doc/images/drc_raw1.png index cf881ed93..35886ff57 100644 Binary files a/src/lay/doc/images/drc_raw1.png and b/src/lay/doc/images/drc_raw1.png differ diff --git a/src/lay/doc/images/drc_raw2.png b/src/lay/doc/images/drc_raw2.png index d0730e934..7086daf31 100644 Binary files a/src/lay/doc/images/drc_raw2.png and b/src/lay/doc/images/drc_raw2.png differ diff --git a/src/lay/doc/images/drc_raw3.png b/src/lay/doc/images/drc_raw3.png index ba85651f4..e1e5d8c2f 100644 Binary files a/src/lay/doc/images/drc_raw3.png and b/src/lay/doc/images/drc_raw3.png differ diff --git a/src/lay/doc/images/drc_rotated1.png b/src/lay/doc/images/drc_rotated1.png index ab74db467..607ef447d 100644 Binary files a/src/lay/doc/images/drc_rotated1.png and b/src/lay/doc/images/drc_rotated1.png differ diff --git a/src/lay/doc/images/drc_rounded_corners.png b/src/lay/doc/images/drc_rounded_corners.png index 02e694e19..582167afe 100644 Binary files a/src/lay/doc/images/drc_rounded_corners.png and b/src/lay/doc/images/drc_rounded_corners.png differ diff --git a/src/lay/doc/images/drc_scaled1.png b/src/lay/doc/images/drc_scaled1.png index 5e9030c59..f1eb3b51e 100644 Binary files a/src/lay/doc/images/drc_scaled1.png and b/src/lay/doc/images/drc_scaled1.png differ diff --git a/src/lay/doc/images/drc_sized1.png b/src/lay/doc/images/drc_sized1.png index ec34fef66..877a673d4 100644 Binary files a/src/lay/doc/images/drc_sized1.png and b/src/lay/doc/images/drc_sized1.png differ diff --git a/src/lay/doc/images/drc_sized2.png b/src/lay/doc/images/drc_sized2.png index 2949de1b1..7a1b4560c 100644 Binary files a/src/lay/doc/images/drc_sized2.png and b/src/lay/doc/images/drc_sized2.png differ diff --git a/src/lay/doc/images/drc_sized3.png b/src/lay/doc/images/drc_sized3.png index 61a4b8ca7..20a1adc46 100644 Binary files a/src/lay/doc/images/drc_sized3.png and b/src/lay/doc/images/drc_sized3.png differ diff --git a/src/lay/doc/images/drc_sized4.png b/src/lay/doc/images/drc_sized4.png index e96e99747..5a6f9a0d5 100644 Binary files a/src/lay/doc/images/drc_sized4.png and b/src/lay/doc/images/drc_sized4.png differ diff --git a/src/lay/doc/images/drc_sized5.png b/src/lay/doc/images/drc_sized5.png index 89d97d50e..03a392d98 100644 Binary files a/src/lay/doc/images/drc_sized5.png and b/src/lay/doc/images/drc_sized5.png differ diff --git a/src/lay/doc/images/drc_sized6.png b/src/lay/doc/images/drc_sized6.png index f045511c0..827bc632f 100644 Binary files a/src/lay/doc/images/drc_sized6.png and b/src/lay/doc/images/drc_sized6.png differ diff --git a/src/lay/doc/images/drc_transformed1.png b/src/lay/doc/images/drc_transformed1.png index ee33932d0..548825e3c 100644 Binary files a/src/lay/doc/images/drc_transformed1.png and b/src/lay/doc/images/drc_transformed1.png differ diff --git a/src/lay/doc/images/drc_xor1.png b/src/lay/doc/images/drc_xor1.png index 16191d3ca..7fab627fb 100644 Binary files a/src/lay/doc/images/drc_xor1.png and b/src/lay/doc/images/drc_xor1.png differ diff --git a/testdata/drc/drctest.drc b/testdata/drc/drctest.drc index 98c1f5a3e..51f8de049 100644 --- a/testdata/drc/drctest.drc +++ b/testdata/drc/drctest.drc @@ -1,4 +1,6 @@ +big_tests = false + verbose(true) source(File.dirname(__FILE__) + "/drctest.gds", "TOPTOP") @@ -23,11 +25,15 @@ def run_testsuite(dm, ic, tiled = false) lb = 100 - a = input(1) + a = input(RBA::LayerInfo::new(1, 0)) b = input(2) c = input(3) x = input(10) y = input(11) + + h = {} + layers.each { |l| h[l] = true } + h[RBA::LayerInfo::new(1, 0)] || raise("missing layer 1/0 in layers list") c.is_merged? == false || raise("unexpected value") @@ -40,7 +46,7 @@ def run_testsuite(dm, ic, tiled = false) a.and(b).xor(l1).is_empty? || raise("xor not empty") tiled || (a.and(b).is_merged? == true || raise("unexpected value")) - a.xor(b).output(lb + 1, dm) + a.xor(b).output(RBA::LayerInfo::new(lb + 1, dm)) a.xor(b).xor(a ^ b).is_empty? || raise("xor not empty") a.not(b).output(lb + 2, dm) a.not(b).xor(a - b).is_empty? || raise("xor not empty") diff --git a/testdata/drc/run_drc_test.sh b/testdata/drc/run_drc_test.sh index d08fa41f5..b51005d52 100755 --- a/testdata/drc/run_drc_test.sh +++ b/testdata/drc/run_drc_test.sh @@ -4,7 +4,7 @@ inst=$(dirname $0) -export LD_LIBRARY_PATH=. +export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH make klayout