From ab5f215417a8db799c2d4a1fa736c16b2caf449e Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Thu, 7 Mar 2024 22:08:45 +0100 Subject: [PATCH] DRC doc --- scripts/drc_lvs_doc/create_drc_samples.rb | 29 +++++++++++++++ src/doc/doc/about/drc_ref_drc.xml | 15 ++++++++ src/doc/doc/about/drc_ref_layer.xml | 35 ++++++++++++++++++ src/doc/doc/images/drc_edge_modes1.png | Bin 0 -> 7292 bytes src/doc/doc/images/drc_edge_modes2.png | Bin 0 -> 6912 bytes src/doc/doc/images/drc_edge_modes3.png | Bin 0 -> 6808 bytes src/doc/doc/images/drc_edge_modes4.png | Bin 0 -> 7165 bytes src/doc/doc/images/drc_edge_modes5.png | Bin 0 -> 6877 bytes src/doc/doc/images/drc_edge_modes6.png | Bin 0 -> 7052 bytes src/doc/docDRCLVSResources.qrc | 6 +++ .../drc/built-in-macros/_drc_complex_ops.rb | 6 +-- src/drc/drc/built-in-macros/_drc_layer.rb | 23 ++++++++++-- 12 files changed, 108 insertions(+), 6 deletions(-) create mode 100644 src/doc/doc/images/drc_edge_modes1.png create mode 100644 src/doc/doc/images/drc_edge_modes2.png create mode 100644 src/doc/doc/images/drc_edge_modes3.png create mode 100644 src/doc/doc/images/drc_edge_modes4.png create mode 100644 src/doc/doc/images/drc_edge_modes5.png create mode 100644 src/doc/doc/images/drc_edge_modes6.png diff --git a/scripts/drc_lvs_doc/create_drc_samples.rb b/scripts/drc_lvs_doc/create_drc_samples.rb index 5594555be..b09ed46fd 100644 --- a/scripts/drc_lvs_doc/create_drc_samples.rb +++ b/scripts/drc_lvs_doc/create_drc_samples.rb @@ -536,6 +536,35 @@ run_demo gen, "input.edges.with_length(0, 3.5)\n .extended(:out => 1.0)", "drc 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(1000, 0), + RBA::Point::new(1000, 5000), + RBA::Point::new(2000, 5000), + RBA::Point::new(2000, 7000), + RBA::Point::new(4000, 7000), + RBA::Point::new(4000, 5000), + RBA::Point::new(5000, 5000), + RBA::Point::new(5000, 0), + RBA::Point::new(4000, 0), + RBA::Point::new(4000, 1000), + RBA::Point::new(2000, 1000), + RBA::Point::new(2000, 0) + ]; + s1.insert(RBA::Polygon::new(pts)) + end +end + +gen = Gen::new + +run_demo gen, "input.edges", "drc_edge_modes1.png" +run_demo gen, "input.edges(convex)", "drc_edge_modes2.png" +run_demo gen, "input.edges(concave)", "drc_edge_modes3.png" +run_demo gen, "input.edges(step)", "drc_edge_modes4.png" +run_demo gen, "input.edges(step_in)", "drc_edge_modes5.png" +run_demo gen, "input.edges(step_out)", "drc_edge_modes6.png" + class Gen def produce(s1, s2) pts = [ diff --git a/src/doc/doc/about/drc_ref_drc.xml b/src/doc/doc/about/drc_ref_drc.xml index 3fab7774b..2a81774f7 100644 --- a/src/doc/doc/about/drc_ref_drc.xml +++ b/src/doc/doc/about/drc_ref_drc.xml @@ -453,6 +453,7 @@ out = in.drc(covering(other) > 2)

Usage:

Polygons will be separated into edges forming their contours. Edge pairs will be @@ -466,6 +467,20 @@ for the edges:

 out = in.drc(primary.edges)
 
+

+The "mode" argument allows selecting specific edges from polygons. +Allowed values are: "convex", "concave", "step", "step_in" and "step_out". +"step" generates edges only if they provide a step between two other +edges. "step_in" creates edges that make a step towards the inside of +the polygon and "step_out" creates edges that make a step towards the +outside: +

+

+out = in.drc(primary.edges(convex))
+
+

+The mode argument is ignored when translating other objects than +polygons.

"end_segments" - Returns the part at the end of each edge of the input

diff --git a/src/doc/doc/about/drc_ref_layer.xml b/src/doc/doc/about/drc_ref_layer.xml index 2e5e6b2b9..1a691b473 100644 --- a/src/doc/doc/about/drc_ref_layer.xml +++ b/src/doc/doc/about/drc_ref_layer.xml @@ -783,6 +783,11 @@ apply to this method.

"edges" - Decomposes the layer into single edges

+

Usage:

+
    +
  • layer.edges
  • +
  • layer.edges(mode)
  • +

Edge pair collections are decomposed into the individual edges that make up the edge pairs. Polygon layers are decomposed into the edges making up the @@ -791,6 +796,36 @@ is called on.

Merged semantics applies, i.e. the result reflects merged polygons rather than individual ones unless raw mode is chosen. +

+The "mode" argument allows selecting specific edges from polygons. +Allowed values are: "convex", "concave", "step", "step_in" and "step_out". +"step" generates edges only if they provide a step between two other +edges. "step_in" creates edges that make a step towards the inside of +the polygon and "step_out" creates edges that make a step towards the +outside: +

+

+out = in.edges(convex)
+
+

+This feature is only available for polygon layers. +

+The following images show the effect of the mode argument: +

+ + + + + + + + + + + + + +

"edges?" - Returns true, if the layer is an edge layer

diff --git a/src/doc/doc/images/drc_edge_modes1.png b/src/doc/doc/images/drc_edge_modes1.png new file mode 100644 index 0000000000000000000000000000000000000000..f5270d9443cde1b1763fae4163ddd44866fb1e01 GIT binary patch literal 7292 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 literal 0 HcmV?d00001 diff --git a/src/doc/doc/images/drc_edge_modes2.png b/src/doc/doc/images/drc_edge_modes2.png new file mode 100644 index 0000000000000000000000000000000000000000..5005e888d34c724542eec5ebba57326e7857b5e9 GIT binary patch literal 6912 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 H{XhH{s;UX3 literal 0 HcmV?d00001 diff --git a/src/doc/doc/images/drc_edge_modes3.png b/src/doc/doc/images/drc_edge_modes3.png new file mode 100644 index 0000000000000000000000000000000000000000..cbc9c978b3aaed8b84c3ab8cf5fe50b77019de74 GIT binary patch literal 6808 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 Xo^M&Cd&}w+w8IWZXNUV+kNo&gVT_MI literal 0 HcmV?d00001 diff --git a/src/doc/doc/images/drc_edge_modes4.png b/src/doc/doc/images/drc_edge_modes4.png new file mode 100644 index 0000000000000000000000000000000000000000..94cf5014040eb688e9df6df502c13df5a83c6791 GIT binary patch literal 7165 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%0ATb!UTTBph zG3MFYctj^1|C8zwht~$f1!^sHi_9gusnLPAr>ZDw*d4P!OUOPy_@DzLJHDTwB~|*OBL%DRka-a<<8>TK*4+`TAgXb24Ajp_E`s54!u+>T^t`;h#N=h$!QopU%f0 z-HdFfVUo1wDRFHB?}kbI79bE$%$HN(q30Lyf;fws9(#Qu#zzz&$@w>5XAq|&QhyRP s#4kn{;rq7`QtUV6-?kUOS9B61Cmvj0)xVr&3gytwcCSsb^^u?d1^W@CUjP6A literal 0 HcmV?d00001 diff --git a/src/doc/doc/images/drc_edge_modes6.png b/src/doc/doc/images/drc_edge_modes6.png new file mode 100644 index 0000000000000000000000000000000000000000..e90b4380f7ab61dd945a9f8340041abb3ef11eed GIT binary patch literal 7052 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 alxTF{(+-PR;-`=V&n-LMOTYT=)c*iE&px&Q literal 0 HcmV?d00001 diff --git a/src/doc/docDRCLVSResources.qrc b/src/doc/docDRCLVSResources.qrc index e91766fe5..acf5f25a2 100644 --- a/src/doc/docDRCLVSResources.qrc +++ b/src/doc/docDRCLVSResources.qrc @@ -54,6 +54,12 @@ doc/images/drc_extended2.png doc/images/drc_extended3.png doc/images/drc_extended4.png + doc/images/drc_edge_modes1.png + doc/images/drc_edge_modes2.png + doc/images/drc_edge_modes3.png + doc/images/drc_edge_modes4.png + doc/images/drc_edge_modes5.png + doc/images/drc_edge_modes6.png doc/images/drc_extents1.png doc/images/drc_extents2.png doc/images/drc_inside.png diff --git a/src/drc/drc/built-in-macros/_drc_complex_ops.rb b/src/drc/drc/built-in-macros/_drc_complex_ops.rb index 23b5b13b5..9950da2e9 100644 --- a/src/drc/drc/built-in-macros/_drc_complex_ops.rb +++ b/src/drc/drc/built-in-macros/_drc_complex_ops.rb @@ -1004,11 +1004,11 @@ CODE # @/code # # The "mode" argument allows selecting specific edges from polygons. - # Allows values are: "convex", "concave", "step", "step_in" and "step_out". - # "step" generates edges only that provide a step between two other + # Allowed values are: "convex", "concave", "step", "step_in" and "step_out". + # "step" generates edges only if they provide a step between two other # edges. "step_in" creates edges that make a step towards the inside of # the polygon and "step_out" creates edges that make a step towards the - # outside (hull contours in clockwise orientation, holes counterclockwise): + # outside: # # @code # out = in.drc(primary.edges(convex)) diff --git a/src/drc/drc/built-in-macros/_drc_layer.rb b/src/drc/drc/built-in-macros/_drc_layer.rb index fe89bb036..5d0409e2a 100644 --- a/src/drc/drc/built-in-macros/_drc_layer.rb +++ b/src/drc/drc/built-in-macros/_drc_layer.rb @@ -3399,17 +3399,34 @@ CODE # individual ones unless raw mode is chosen. # # The "mode" argument allows selecting specific edges from polygons. - # Allows values are: "convex", "concave", "step", "step_in" and "step_out". - # "step" generates edges only that provide a step between two other + # Allowed values are: "convex", "concave", "step", "step_in" and "step_out". + # "step" generates edges only if they provide a step between two other # edges. "step_in" creates edges that make a step towards the inside of # the polygon and "step_out" creates edges that make a step towards the - # outside (hull contours in clockwise orientation, holes counterclockwise): + # outside: # # @code # out = in.edges(convex) # @/code # # This feature is only available for polygon layers. + # + # The following images show the effect of the mode argument: + # + # @table + # @tr + # @td @img(/images/drc_edge_modes1.png) @/td + # @td @img(/images/drc_edge_modes2.png) @/td + # @/tr + # @tr + # @td @img(/images/drc_edge_modes3.png) @/td + # @td @img(/images/drc_edge_modes4.png) @/td + # @/tr + # @tr + # @td @img(/images/drc_edge_modes5.png) @/td + # @td @img(/images/drc_edge_modes6.png) @/td + # @/tr + # @/table %w(edges).each do |f| eval <<"CODE"