From 68f98d9f0d0807ab2414d3db4aa5118113363250 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Thu, 4 Jul 2019 23:55:46 +0200 Subject: [PATCH] Some typos fixed, connect_implicit now can be used multiple times (but without glob pattern) --- src/drc/drc/built-in-macros/_drc_engine.rb | 18 +++++----- src/drc/drc/built-in-macros/_drc_netter.rb | 34 ++++++++----------- src/lay/lay/doc/manual/lvs_connect.xml | 15 ++++++++ src/lay/lay/doc/manual/metal_connections.png | Bin 0 -> 13184 bytes 4 files changed, 38 insertions(+), 29 deletions(-) create mode 100644 src/lay/lay/doc/manual/lvs_connect.xml create mode 100644 src/lay/lay/doc/manual/metal_connections.png diff --git a/src/drc/drc/built-in-macros/_drc_engine.rb b/src/drc/drc/built-in-macros/_drc_engine.rb index 617f5aa76..099062b27 100644 --- a/src/drc/drc/built-in-macros/_drc_engine.rb +++ b/src/drc/drc/built-in-macros/_drc_engine.rb @@ -141,7 +141,7 @@ module DRC # @brief Supplies the MOS3 transistor extractor class # @name mos3 # @synopsis mos3(name) - # Use this class with \device_extract to specify extraction of a + # Use this class with \extract_devices to specify extraction of a # three-terminal MOS transistor def mos3(name) @@ -152,7 +152,7 @@ module DRC # @brief Supplies the MOS4 transistor extractor class # @name mos4 # @synopsis mos4(name) - # Use this class with \device_extract to specify extraction of a + # Use this class with \extract_devices to specify extraction of a # four-terminal MOS transistor def mos4(name) @@ -163,7 +163,7 @@ module DRC # @brief Supplies the BJT3 transistor extractor class # @name bjt3 # @synopsis bjt3(name) - # Use this class with \device_extract to specify extraction of a + # Use this class with \extract_devices to specify extraction of a # bipolar junction transistor def bjt3(name) @@ -174,7 +174,7 @@ module DRC # @brief Supplies the BJT4 transistor extractor class # @name bjt4 # @synopsis bjt4(name) - # Use this class with \device_extract to specify extraction of a + # Use this class with \extract_devices to specify extraction of a # bipolar junction transistor with a substrate terminal def bjt4(name) @@ -185,7 +185,7 @@ module DRC # @brief Supplies the diode extractor class # @name diode # @synopsis diode(name) - # Use this class with \device_extract to specify extraction of a + # Use this class with \extract_devices to specify extraction of a # planar diode def diode(name) @@ -196,7 +196,7 @@ module DRC # @brief Supplies the resistor extractor class # @name resistor # @synopsis resistor(name, sheet_rho) - # Use this class with \device_extract to specify extraction of a resistor. + # Use this class with \extract_devices to specify extraction of a resistor. # The sheet_rho value is the sheet resistance in ohms/square. def resistor(name, sheet_rho) @@ -207,7 +207,7 @@ module DRC # @brief Supplies the resistor extractor class that includes a bulk terminal # @name resistor_with_bulk # @synopsis resistor_with_bulk(name, sheet_rho) - # Use this class with \device_extract to specify extraction of a resistor + # Use this class with \extract_devices to specify extraction of a resistor # with a bulk terminal. # The sheet_rho value is the sheet resistance in ohms/square. @@ -219,7 +219,7 @@ module DRC # @brief Supplies the capacitor extractor class # @name capacitor # @synopsis capacitor(name, area_cap) - # Use this class with \device_extract to specify extraction of a capacitor. + # Use this class with \extract_devices to specify extraction of a capacitor. # The area_cap argument is the capacitance in Farad per square micrometer. def capacitor(name, area_cap) @@ -230,7 +230,7 @@ module DRC # @brief Supplies the capacitor extractor class that includes a bulk terminal # @name capacitor_with_bulk # @synopsis capacitor_with_bulk(name, area_cap) - # Use this class with \device_extract to specify extraction of a capacitor + # Use this class with \extract_devices to specify extraction of a capacitor # with a bulk terminal. # The area_cap argument is the capacitance in Farad per square micrometer. diff --git a/src/drc/drc/built-in-macros/_drc_netter.rb b/src/drc/drc/built-in-macros/_drc_netter.rb index 8f333b0c9..aa86fe84e 100644 --- a/src/drc/drc/built-in-macros/_drc_netter.rb +++ b/src/drc/drc/built-in-macros/_drc_netter.rb @@ -65,7 +65,7 @@ module DRC def initialize(engine) @engine = engine @netlisted = false - @connect_implicit = "" + @connect_implicit = [] @l2n = nil end @@ -186,7 +186,7 @@ module DRC def clear_connections @netlisted = false - @connect_implicit = "" + @connect_implicit = [] _clear_data end @@ -194,34 +194,21 @@ module DRC # @name connect_implicit # @brief Specifies a search pattern for labels which create implicit net connections # @synopsis connect_implicit(label_pattern) - # Use this method to supply a glob pattern for labels which create implicit net connections + # Use this method to supply label strings which create implicit net connections # on the top level circuit. This feature is useful to connect identically labelled nets - # while a component isn't integrated yet. If the component is integrated, net may be connected + # while a component isn't integrated yet. If the component is integrated, nets may be connected # on a higher hierarchy level - e.g. by a power mesh. Inside the component this net consists # of individual islands. To properly perform netlist extraction and comparison, these islands # need to be connected even though there isn't a physical connection. "connect_implicit" can # achive this if these islands are labelled with the same text on the top level of the # component. # - # Glob pattern are used which resemble shell file pattern: "*" is for all labels, "VDD" - # for all "VDD" labels (pattern act case sensitive). "VDD*" is for all labels beginning - # with "VDD" (still different labels will be connected to different nets!). "{VDD,VSS}" - # is either "VDD" or "VSS". - # - # The search pattern is applied on the next net extraction. The search pattern is cleared + # The implicit connections are applied on the next net extraction and cleared # on "clear_connections". def connect_implicit(arg) - cleanup - - if arg != @connect_implicit - if @connect_implicit != "" && arg != "" - raise("connect_implicit can only be used once") - end - @connect_implicit = arg - end - + @connect_implicit << arg end # %DRC% @@ -338,7 +325,14 @@ module DRC # run extraction in a timed environment if ! @netlisted - @engine._cmd(@l2n, :extract_netlist, @connect_implicit) + # build a glob expression from the parts + exprs = @connect_implicit.collect { |c| c.gsub(/\?\*\[\]\{\},\(\)\\/) { |x| "\\" + x } } + if exprs.size > 1 + expr = "{" + exprs.join(",") + "}" + else + expr = exprs[0] || "" + end + @engine._cmd(@l2n, :extract_netlist, expr) @netlisted = true end diff --git a/src/lay/lay/doc/manual/lvs_connect.xml b/src/lay/lay/doc/manual/lvs_connect.xml new file mode 100644 index 000000000..96151e5f5 --- /dev/null +++ b/src/lay/lay/doc/manual/lvs_connect.xml @@ -0,0 +1,15 @@ + + + + + + LVS Connectivity + + + + + +

+

+ +
diff --git a/src/lay/lay/doc/manual/metal_connections.png b/src/lay/lay/doc/manual/metal_connections.png new file mode 100644 index 0000000000000000000000000000000000000000..a5e184dfd7919ed37a7ef4419b63073263eedb9e GIT binary patch literal 13184 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 Jl@>he{{XdVa%TVl literal 0 HcmV?d00001