origen_arm_debug 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/config/commands.rb +2 -0
 - data/config/version.rb +2 -2
 - data/lib/origen_arm_debug/dap.rb +2 -1
 - data/lib/origen_arm_debug/jtag_dp.rb +14 -3
 - data/lib/origen_arm_debug/jtag_dp_controller.rb +5 -5
 - data/lib/origen_arm_debug_dev/dut.rb +1 -1
 - data/lib/origen_arm_debug_dev/dut_jtag.rb +13 -12
 - data/templates/web/index.md.erb +43 -6
 - data/templates/web/index.md.erb~ +238 -0
 - metadata +4 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: e947a1abfa51a87475064a20b02b28a7e51dd720
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 47840a0bc06b60f0dce4f030a6ae23c9d020e0ce
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: d8679bb32de39d88f9fded1871c9bb47eec607dc8ab3c0f498a7f99d7d05d64719c831fc28df450806814fcc28277a8d3433cca5d931e8dbd50f42d8e1b8115f
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: cba98e60b245a3113719b7baec378482f5677307bb9a6e0685d1b9d1dccfc0c372d8cc9f1c41355e1db4c54ab40ae31af2c438d78315b95e936bb10fc782b9f4
         
     | 
    
        data/config/commands.rb
    CHANGED
    
    | 
         @@ -30,6 +30,8 @@ when "examples"    # , "test" 
     | 
|
| 
       30 
30 
     | 
    
         
             
              load "#{Origen.top}/lib/origen/commands/generate.rb"
         
     | 
| 
       31 
31 
     | 
    
         
             
              ARGV = %w(workout -t swd -e j750 -r approved)
         
     | 
| 
       32 
32 
     | 
    
         
             
              load "#{Origen.top}/lib/origen/commands/generate.rb"
         
     | 
| 
      
 33 
     | 
    
         
            +
              ARGV = %w(workout -t config_test -e j750 -r approved/config_test)
         
     | 
| 
      
 34 
     | 
    
         
            +
              load "#{Origen.top}/lib/origen/commands/generate.rb"
         
     | 
| 
       33 
35 
     | 
    
         | 
| 
       34 
36 
     | 
    
         
             
              if Origen.app.stats.changed_files == 0 &&
         
     | 
| 
       35 
37 
     | 
    
         
             
                 Origen.app.stats.new_files == 0 &&
         
     | 
    
        data/config/version.rb
    CHANGED
    
    
    
        data/lib/origen_arm_debug/dap.rb
    CHANGED
    
    | 
         @@ -20,7 +20,8 @@ module OrigenARMDebug 
     | 
|
| 
       20 
20 
     | 
    
         
             
                  end
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
22 
     | 
    
         
             
                  if options[:jtag] || parent.respond_to?(:jtag)
         
     | 
| 
       23 
     | 
    
         
            -
                     
     | 
| 
      
 23 
     | 
    
         
            +
                    options[:class_name] = 'JTAG_DP'
         
     | 
| 
      
 24 
     | 
    
         
            +
                    dps << sub_block(:jtag_dp, options)
         
     | 
| 
       24 
25 
     | 
    
         
             
                  end
         
     | 
| 
       25 
26 
     | 
    
         | 
| 
       26 
27 
     | 
    
         
             
                  Array(options[:mem_aps]).each do |name, base_address|
         
     | 
| 
         @@ -2,8 +2,19 @@ module OrigenARMDebug 
     | 
|
| 
       2 
2 
     | 
    
         
             
              class JTAG_DP
         
     | 
| 
       3 
3 
     | 
    
         
             
                include Origen::Model
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
      
 5 
     | 
    
         
            +
                attr_reader :dpacc_select, :apacc_select
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
       5 
7 
     | 
    
         
             
                def initialize(options = {})
         
     | 
| 
       6 
     | 
    
         
            -
                   
     | 
| 
      
 8 
     | 
    
         
            +
                  options = {
         
     | 
| 
      
 9 
     | 
    
         
            +
                    ir_size:       4,
         
     | 
| 
      
 10 
     | 
    
         
            +
                    idcode_select: 0b1110,
         
     | 
| 
      
 11 
     | 
    
         
            +
                    abort_select:  0b1000,
         
     | 
| 
      
 12 
     | 
    
         
            +
                    dpacc_select:  0b1010,
         
     | 
| 
      
 13 
     | 
    
         
            +
                    apacc_select:  0b1011
         
     | 
| 
      
 14 
     | 
    
         
            +
                  }.merge(options)
         
     | 
| 
      
 15 
     | 
    
         
            +
                  @dpacc_select = options[:dpacc_select]
         
     | 
| 
      
 16 
     | 
    
         
            +
                  @apacc_select = options[:apacc_select]
         
     | 
| 
      
 17 
     | 
    
         
            +
                  add_reg :ir, 0, size: options[:ir_size]
         
     | 
| 
       7 
18 
     | 
    
         | 
| 
       8 
19 
     | 
    
         
             
                  # Virtual reg used to represent all of the various 35-bit scan chains
         
     | 
| 
       9 
20 
     | 
    
         
             
                  reg :dr, 0, size: 35 do |reg|
         
     | 
| 
         @@ -12,7 +23,7 @@ module OrigenARMDebug 
     | 
|
| 
       12 
23 
     | 
    
         
             
                    reg.bit 0, :rnw
         
     | 
| 
       13 
24 
     | 
    
         
             
                  end
         
     | 
| 
       14 
25 
     | 
    
         | 
| 
       15 
     | 
    
         
            -
                  reg :idcode,  
     | 
| 
      
 26 
     | 
    
         
            +
                  reg :idcode, options[:idcode_select], access: :ro do |reg|
         
     | 
| 
       16 
27 
     | 
    
         
             
                    reg.bit 31..28, :version
         
     | 
| 
       17 
28 
     | 
    
         
             
                    reg.bit 27..12, :partno
         
     | 
| 
       18 
29 
     | 
    
         
             
                    reg.bit 11..1, :designer
         
     | 
| 
         @@ -42,7 +53,7 @@ module OrigenARMDebug 
     | 
|
| 
       42 
53 
     | 
    
         | 
| 
       43 
54 
     | 
    
         
             
                  add_reg :rdbuff, 0xC, access: :ro, reset: 0
         
     | 
| 
       44 
55 
     | 
    
         | 
| 
       45 
     | 
    
         
            -
                  reg :abort,  
     | 
| 
      
 56 
     | 
    
         
            +
                  reg :abort, options[:abort_select], access: :wo do |reg|
         
     | 
| 
       46 
57 
     | 
    
         
             
                    reg.bit 0, :dapabort
         
     | 
| 
       47 
58 
     | 
    
         
             
                  end
         
     | 
| 
       48 
59 
     | 
    
         
             
                end
         
     | 
| 
         @@ -33,7 +33,7 @@ module OrigenARMDebug 
     | 
|
| 
       33 
33 
     | 
    
         
             
                          dr[0].write(0)
         
     | 
| 
       34 
34 
     | 
    
         
             
                          dr[2..1].write(reg.offset >> 2)
         
     | 
| 
       35 
35 
     | 
    
         
             
                          dr[34..3].copy_all(reg)
         
     | 
| 
       36 
     | 
    
         
            -
                          ir.write!( 
     | 
| 
      
 36 
     | 
    
         
            +
                          ir.write!(dpacc_select)
         
     | 
| 
       37 
37 
     | 
    
         
             
                          dut.jtag.write_dr(dr)
         
     | 
| 
       38 
38 
     | 
    
         | 
| 
       39 
39 
     | 
    
         
             
                        else
         
     | 
| 
         @@ -55,7 +55,7 @@ module OrigenARMDebug 
     | 
|
| 
       55 
55 
     | 
    
         
             
                    dr[0].write(0)
         
     | 
| 
       56 
56 
     | 
    
         
             
                    dr[2..1].write(reg.offset >> 2)
         
     | 
| 
       57 
57 
     | 
    
         
             
                    dr[34..3].copy_all(reg)
         
     | 
| 
       58 
     | 
    
         
            -
                    ir.write!( 
     | 
| 
      
 58 
     | 
    
         
            +
                    ir.write!(apacc_select)
         
     | 
| 
       59 
59 
     | 
    
         
             
                    dut.jtag.write_dr(dr, options)
         
     | 
| 
       60 
60 
     | 
    
         
             
                  end
         
     | 
| 
       61 
61 
     | 
    
         
             
                end
         
     | 
| 
         @@ -86,7 +86,7 @@ module OrigenARMDebug 
     | 
|
| 
       86 
86 
     | 
    
         
             
                          dr[0].write(1)
         
     | 
| 
       87 
87 
     | 
    
         
             
                          dr[2..1].write(reg.offset >> 2)
         
     | 
| 
       88 
88 
     | 
    
         
             
                          dr[34..3].write(0)
         
     | 
| 
       89 
     | 
    
         
            -
                          ir.write!( 
     | 
| 
      
 89 
     | 
    
         
            +
                          ir.write!(dpacc_select)
         
     | 
| 
       90 
90 
     | 
    
         
             
                          dut.jtag.write_dr(dr)
         
     | 
| 
       91 
91 
     | 
    
         | 
| 
       92 
92 
     | 
    
         
             
                          # Part 2 - Now read real data from RDBUFF (DP-Reg)
         
     | 
| 
         @@ -117,7 +117,7 @@ module OrigenARMDebug 
     | 
|
| 
       117 
117 
     | 
    
         
             
                    dr[0].write(1)
         
     | 
| 
       118 
118 
     | 
    
         
             
                    dr[2..1].write(reg.offset >> 2)
         
     | 
| 
       119 
119 
     | 
    
         
             
                    dr[34..3].write(0)
         
     | 
| 
       120 
     | 
    
         
            -
                    ir.write!( 
     | 
| 
      
 120 
     | 
    
         
            +
                    ir.write!(apacc_select)
         
     | 
| 
       121 
121 
     | 
    
         
             
                    dut.jtag.write_dr(dr)
         
     | 
| 
       122 
122 
     | 
    
         | 
| 
       123 
123 
     | 
    
         
             
                    # Calling AP should provide any delay parameter for wait states between AP read request
         
     | 
| 
         @@ -133,7 +133,7 @@ module OrigenARMDebug 
     | 
|
| 
       133 
133 
     | 
    
         
             
                    dr[2..1].write(rdbuff.offset >> 2)
         
     | 
| 
       134 
134 
     | 
    
         
             
                    dr[34..3].copy_all(reg)
         
     | 
| 
       135 
135 
     | 
    
         
             
                    options[:mask] = options[:mask] << 3 unless options[:mask].nil?
         
     | 
| 
       136 
     | 
    
         
            -
                    ir.write!( 
     | 
| 
      
 136 
     | 
    
         
            +
                    ir.write!(dpacc_select)
         
     | 
| 
       137 
137 
     | 
    
         
             
                    dut.jtag.read_dr(dr, options)
         
     | 
| 
       138 
138 
     | 
    
         
             
                  end
         
     | 
| 
       139 
139 
     | 
    
         
             
                end
         
     | 
| 
         @@ -5,7 +5,7 @@ module OrigenARMDebugDev 
     | 
|
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
                # Adds jtag-required pins to the simple dut model
         
     | 
| 
       7 
7 
     | 
    
         
             
                # Returns nothing.
         
     | 
| 
       8 
     | 
    
         
            -
                def initialize
         
     | 
| 
      
 8 
     | 
    
         
            +
                def initialize(options = {})
         
     | 
| 
       9 
9 
     | 
    
         
             
                  super
         
     | 
| 
       10 
10 
     | 
    
         
             
                  add_pin :tclk
         
     | 
| 
       11 
11 
     | 
    
         
             
                  add_pin :tdi
         
     | 
| 
         @@ -15,18 +15,19 @@ module OrigenARMDebugDev 
     | 
|
| 
       15 
15 
     | 
    
         
             
                  add_pin :swd_clk
         
     | 
| 
       16 
16 
     | 
    
         
             
                  add_pin :swd_dio
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
      
 18 
     | 
    
         
            +
                  options[:class_name] = 'OrigenARMDebug::DAP'
         
     | 
| 
      
 19 
     | 
    
         
            +
                  options[:mem_aps] = {
         
     | 
| 
      
 20 
     | 
    
         
            +
                    mem_ap: {
         
     | 
| 
      
 21 
     | 
    
         
            +
                      base_address:      0x00000000,
         
     | 
| 
      
 22 
     | 
    
         
            +
                      latency:           16,
         
     | 
| 
      
 23 
     | 
    
         
            +
                      apreg_access_wait: 8,
         
     | 
| 
      
 24 
     | 
    
         
            +
                      apmem_access_wait: 8,
         
     | 
| 
      
 25 
     | 
    
         
            +
                      csw_reset:         0x23000040
         
     | 
| 
      
 26 
     | 
    
         
            +
                    },
         
     | 
| 
      
 27 
     | 
    
         
            +
                    mdm_ap: 0x01000000
         
     | 
| 
      
 28 
     | 
    
         
            +
                  }
         
     | 
| 
       18 
29 
     | 
    
         
             
                  # Specify (customize) ARM Debug implementation details
         
     | 
| 
       19 
     | 
    
         
            -
                  sub_block :arm_debug,  
     | 
| 
       20 
     | 
    
         
            -
                                        mem_aps:    {
         
     | 
| 
       21 
     | 
    
         
            -
                                          mem_ap: {
         
     | 
| 
       22 
     | 
    
         
            -
                                            base_address:      0x00000000,
         
     | 
| 
       23 
     | 
    
         
            -
                                            latency:           16,
         
     | 
| 
       24 
     | 
    
         
            -
                                            apreg_access_wait: 8,
         
     | 
| 
       25 
     | 
    
         
            -
                                            apmem_access_wait: 8,
         
     | 
| 
       26 
     | 
    
         
            -
                                            csw_reset:         0x23000040
         
     | 
| 
       27 
     | 
    
         
            -
                                          },
         
     | 
| 
       28 
     | 
    
         
            -
                                          mdm_ap: 0x01000000
         
     | 
| 
       29 
     | 
    
         
            -
                                        }
         
     | 
| 
      
 30 
     | 
    
         
            +
                  sub_block :arm_debug, options
         
     | 
| 
       30 
31 
     | 
    
         
             
                end
         
     | 
| 
       31 
32 
     | 
    
         
             
              end
         
     | 
| 
       32 
33 
     | 
    
         
             
            end
         
     | 
    
        data/templates/web/index.md.erb
    CHANGED
    
    | 
         @@ -28,11 +28,10 @@ if your app is a plugin. 
     | 
|
| 
       28 
28 
     | 
    
         | 
| 
       29 
29 
     | 
    
         
             
            ### How To Use
         
     | 
| 
       30 
30 
     | 
    
         | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
            to the Origen register API via
         
     | 
| 
      
 31 
     | 
    
         
            +
            The most common way to use the Arm Debugger plugin is through the Origen register API via
         
     | 
| 
       33 
32 
     | 
    
         
             
            <code>read_register</code> and <code>write_register</code> methods.
         
     | 
| 
       34 
33 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
            You must  
     | 
| 
      
 34 
     | 
    
         
            +
            You must include a compatible physical driver depending on what debug
         
     | 
| 
       36 
35 
     | 
    
         
             
            interface your device has, one of the following can be used:
         
     | 
| 
       37 
36 
     | 
    
         | 
| 
       38 
37 
     | 
    
         
             
            * [JTAG](http://origen-sdk.org/jtag)
         
     | 
| 
         @@ -41,9 +40,8 @@ interface your device has, one of the following can be used: 
     | 
|
| 
       41 
40 
     | 
    
         
             
            ~~~ruby
         
     | 
| 
       42 
41 
     | 
    
         
             
            class DUT
         
     | 
| 
       43 
42 
     | 
    
         
             
              include Origen::TopLevel
         
     | 
| 
       44 
     | 
    
         
            -
              include OrigenARMDebug
         
     | 
| 
       45 
43 
     | 
    
         | 
| 
       46 
     | 
    
         
            -
              #  
     | 
| 
      
 44 
     | 
    
         
            +
              # Include the required physical driver, JTAG in this example
         
     | 
| 
       47 
45 
     | 
    
         
             
              include OrigenJTAG
         
     | 
| 
       48 
46 
     | 
    
         | 
| 
       49 
47 
     | 
    
         
             
              def initialize
         
     | 
| 
         @@ -55,7 +53,11 @@ class DUT 
     | 
|
| 
       55 
53 
     | 
    
         
             
                # Simple example using default wait-states and latency:
         
     | 
| 
       56 
54 
     | 
    
         
             
                #   mem_ap:  APSEL = 0x00 (base_address[31:24])
         
     | 
| 
       57 
55 
     | 
    
         
             
                #   mem2_ap: APSEL = 0x01 (base_address[31:24])
         
     | 
| 
       58 
     | 
    
         
            -
                 
     | 
| 
      
 56 
     | 
    
         
            +
                mem_aps = {
         
     | 
| 
      
 57 
     | 
    
         
            +
                  mem_ap: { base_address: 0x00000000 }
         
     | 
| 
      
 58 
     | 
    
         
            +
                  mem2_ap: { base_address: 0x10000000 }
         
     | 
| 
      
 59 
     | 
    
         
            +
                }
         
     | 
| 
      
 60 
     | 
    
         
            +
                sub_block :arm_debug, class_name: 'OrigenARMDebug::DAP', mem_aps: mem_aps                           
         
     | 
| 
       59 
61 
     | 
    
         
             
              end
         
     | 
| 
       60 
62 
     | 
    
         | 
| 
       61 
63 
     | 
    
         
             
              # Hook the ARMDebug module into the register API, any register read
         
     | 
| 
         @@ -97,6 +99,41 @@ You can also adjust the intermediate wait-states and latency parameters: 
     | 
|
| 
       97 
99 
     | 
    
         
             
            dut.arm_debug.ahb_ap.apmem_access_wait = 16
         
     | 
| 
       98 
100 
     | 
    
         
             
            dut.arm_debug.ahb_ap.apreg_access_wait = 12
         
     | 
| 
       99 
101 
     | 
    
         
             
            dut.arm_debug.ahb_ap.latency = 8
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
            # You can define these at instantiation as well
         
     | 
| 
      
 104 
     | 
    
         
            +
            mem_aps = {
         
     | 
| 
      
 105 
     | 
    
         
            +
              mem_ap: { base_address: 0x00000000, latency: 8, apreg_access_wait: 12, apmem_access_wait: 16 }
         
     | 
| 
      
 106 
     | 
    
         
            +
              mem2_ap: { base_address: 0x10000000, latency: 8, apreg_access_wait: 12, apmem_access_wait: 16 }
         
     | 
| 
      
 107 
     | 
    
         
            +
            }
         
     | 
| 
      
 108 
     | 
    
         
            +
            sub_block :arm_debug, class_name: 'OrigenARMDebug::DAP', mem_aps: mem_aps
         
     | 
| 
      
 109 
     | 
    
         
            +
            ~~~
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
      
 111 
     | 
    
         
            +
            When used with the JTAG physical driver the default IR size is 4 and the default register select values are:
         
     | 
| 
      
 112 
     | 
    
         
            +
             
     | 
| 
      
 113 
     | 
    
         
            +
            ~~~
         
     | 
| 
      
 114 
     | 
    
         
            +
            idcode_select = 0b1110
         
     | 
| 
      
 115 
     | 
    
         
            +
            abort_select  = 0b1000
         
     | 
| 
      
 116 
     | 
    
         
            +
            dpacc_select  = 0b1010
         
     | 
| 
      
 117 
     | 
    
         
            +
            apacc_select  = 0b1011
         
     | 
| 
      
 118 
     | 
    
         
            +
            ~~~
         
     | 
| 
      
 119 
     | 
    
         
            +
             
     | 
| 
      
 120 
     | 
    
         
            +
            You can set non-default values at instantiation like this:
         
     | 
| 
      
 121 
     | 
    
         
            +
             
     | 
| 
      
 122 
     | 
    
         
            +
            ~~~ruby
         
     | 
| 
      
 123 
     | 
    
         
            +
            mem_aps = {
         
     | 
| 
      
 124 
     | 
    
         
            +
              mem_ap: { base_address: 0x00000000 }
         
     | 
| 
      
 125 
     | 
    
         
            +
              mem2_ap: { base_address: 0x10000000 }
         
     | 
| 
      
 126 
     | 
    
         
            +
            }
         
     | 
| 
      
 127 
     | 
    
         
            +
            instantiation_options[:class_name] = 'OrigenARMDebug::DAP'
         
     | 
| 
      
 128 
     | 
    
         
            +
            instantiation_options[:mem_aps] = mem_aps
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
            instantiation_options[:ir_size] = 8
         
     | 
| 
      
 131 
     | 
    
         
            +
            instantiation_options[:idcode_select] = 0xFE
         
     | 
| 
      
 132 
     | 
    
         
            +
            instantiation_options[:abort_select] = 0xF8
         
     | 
| 
      
 133 
     | 
    
         
            +
            instantiation_options[:dpacc_select] = 0xFA
         
     | 
| 
      
 134 
     | 
    
         
            +
            instantiation_options[:apacc_select] = 0xFB
         
     | 
| 
      
 135 
     | 
    
         
            +
             
     | 
| 
      
 136 
     | 
    
         
            +
            sub_block :arm_debug, instantiation_options
         
     | 
| 
       100 
137 
     | 
    
         
             
            ~~~
         
     | 
| 
       101 
138 
     | 
    
         | 
| 
       102 
139 
     | 
    
         
             
            ### Company Customization
         
     | 
| 
         @@ -0,0 +1,238 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            % render "layouts/basic.html" do
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            %# HTML tags can be embedded in mark down files if you want to do specific custom
         
     | 
| 
      
 4 
     | 
    
         
            +
            %# formatting like this, but in most cases that is not required.
         
     | 
| 
      
 5 
     | 
    
         
            +
            <h1><%= Origen.app.namespace %> <span style="font-size: 14px">(<%= Origen.app.version %>)</span></h1>
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            ### Purpose
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            This library provides register and memory read/write and debug control capability via the ARM Debug Interface v5 Spec. 
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            ### How To Import
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            In your Gemfile add:
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            ~~~ruby
         
     | 
| 
      
 16 
     | 
    
         
            +
            gem "origen_arm_debug", ">= <%= Origen.app.version %>"
         
     | 
| 
      
 17 
     | 
    
         
            +
            ~~~
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            or if your application is a plugin add this to your <code>.gemspec</code>
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            ~~~ruby
         
     | 
| 
      
 22 
     | 
    
         
            +
            spec.add_development_dependency "origen_arm_debug", ">= <%= Origen.app.version %>"
         
     | 
| 
      
 23 
     | 
    
         
            +
            ~~~
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            __NOTE:__ You will also need to include <code>require 'origen_arm_debug'</code> somewhere in your environment
         
     | 
| 
      
 26 
     | 
    
         
            +
            if your app is a plugin.
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            ### How To Use
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            The most common way to use the Arm Debugger plugin is through the Origen register API via
         
     | 
| 
      
 32 
     | 
    
         
            +
            <code>read_register</code> and <code>write_register</code> methods.
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
            You must include a compatible physical driver depending on what debug
         
     | 
| 
      
 35 
     | 
    
         
            +
            interface your device has, one of the following can be used:
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
            * [JTAG](http://origen-sdk.org/jtag)
         
     | 
| 
      
 38 
     | 
    
         
            +
            * [Single Wire Debug](http://origen-sdk.org/swd)
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
            ~~~ruby
         
     | 
| 
      
 41 
     | 
    
         
            +
            class DUT
         
     | 
| 
      
 42 
     | 
    
         
            +
              include Origen::TopLevel
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
              # Include the required physical driver, JTAG in this example
         
     | 
| 
      
 45 
     | 
    
         
            +
              include OrigenJTAG
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
              def initialize
         
     | 
| 
      
 48 
     | 
    
         
            +
                reg :myreg, 0x0012, size: 16 do |reg|
         
     | 
| 
      
 49 
     | 
    
         
            +
                  reg.bits 15..8, :upper_byte
         
     | 
| 
      
 50 
     | 
    
         
            +
                  reg.bits 7..0,  :lower_byte
         
     | 
| 
      
 51 
     | 
    
         
            +
                end
         
     | 
| 
      
 52 
     | 
    
         
            +
                
         
     | 
| 
      
 53 
     | 
    
         
            +
                # Simple example using default wait-states and latency:
         
     | 
| 
      
 54 
     | 
    
         
            +
                #   mem_ap:  APSEL = 0x00 (base_address[31:24])
         
     | 
| 
      
 55 
     | 
    
         
            +
                #   mem2_ap: APSEL = 0x01 (base_address[31:24])
         
     | 
| 
      
 56 
     | 
    
         
            +
                mem_aps = {
         
     | 
| 
      
 57 
     | 
    
         
            +
                  mem_ap: { base_address: 0x00000000 }
         
     | 
| 
      
 58 
     | 
    
         
            +
                  mem2_ap: { base_address: 0x10000000 }
         
     | 
| 
      
 59 
     | 
    
         
            +
                }
         
     | 
| 
      
 60 
     | 
    
         
            +
                sub_block :arm_debug, class_name: 'OrigenARMDebug::DAP', mem_aps: mem_aps                           
         
     | 
| 
      
 61 
     | 
    
         
            +
              end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
              # Hook the ARMDebug module into the register API, any register read
         
     | 
| 
      
 64 
     | 
    
         
            +
              # requests will use the ARM Debug protocol by default
         
     | 
| 
      
 65 
     | 
    
         
            +
              def read_register(reg, options={})
         
     | 
| 
      
 66 
     | 
    
         
            +
                arm_debug.mem_ap.read_register(reg, options)
         
     | 
| 
      
 67 
     | 
    
         
            +
              end
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
              # As above for write requests
         
     | 
| 
      
 70 
     | 
    
         
            +
              def write_register(reg, options={})
         
     | 
| 
      
 71 
     | 
    
         
            +
                arm_debug.mem_ap.write_register(reg, options)
         
     | 
| 
      
 72 
     | 
    
         
            +
              end
         
     | 
| 
      
 73 
     | 
    
         
            +
            end
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
            DUT.new.myreg.write!(0x55AA)  # => Will generate the required vectors using the ARM debug protocol
         
     | 
| 
      
 76 
     | 
    
         
            +
            ~~~
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
            You can access the lower-level API using conventional Origen register transactions:
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
            ~~~ruby
         
     | 
| 
      
 81 
     | 
    
         
            +
            arm_debug.sw_dp.idcode.read!(0x2BA01477)
         
     | 
| 
      
 82 
     | 
    
         
            +
            arm_debug.sw_dp.ctrlstat.write!(0x5000_0000)  # Power-up
         
     | 
| 
      
 83 
     | 
    
         
            +
            arm_debug.sw_dp.ctrlstat.read!(0xF0000000)    # Verify
         
     | 
| 
      
 84 
     | 
    
         
            +
            arm_debug.ahb_ap.idr.read!(0x24770011)
         
     | 
| 
      
 85 
     | 
    
         
            +
            arm_debug.sw_dp.select.write!(0)              # Select AHB-AP, bank 0       
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
            # Set the SIZE field of CSW to 0x2 (32-bit transfers) + AddrInc=1
         
     | 
| 
      
 88 
     | 
    
         
            +
            arm_debug.ahb_ap.csw.write!(0x23000052)
         
     | 
| 
      
 89 
     | 
    
         
            +
            ~~~
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
            You can also adjust the intermediate wait-states and latency parameters:
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
            * [AP.apreg_access_wait](http://origen-sdk.org/arm_debug/api/OrigenARMDebug/AP.html#apreg_access_wait-instance_method)
         
     | 
| 
      
 94 
     | 
    
         
            +
            * [MemAP.apmem_access_wait](http://origen-sdk.org/arm_debug/api/OrigenARMDebug/MemAP.html#apmem_access_wait-instance_method)
         
     | 
| 
      
 95 
     | 
    
         
            +
            * [MemAP.latency](http://origen-sdk.org/arm_debug/api/OrigenARMDebug/MemAP.html#latency-instance_method)
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
            ~~~ruby
         
     | 
| 
      
 98 
     | 
    
         
            +
            # Assuming ahb_ap has been previously defined
         
     | 
| 
      
 99 
     | 
    
         
            +
            dut.arm_debug.ahb_ap.apmem_access_wait = 16
         
     | 
| 
      
 100 
     | 
    
         
            +
            dut.arm_debug.ahb_ap.apreg_access_wait = 12
         
     | 
| 
      
 101 
     | 
    
         
            +
            dut.arm_debug.ahb_ap.latency = 8
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
            # You can define these at instantiation as well
         
     | 
| 
      
 104 
     | 
    
         
            +
            mem_aps = {
         
     | 
| 
      
 105 
     | 
    
         
            +
              mem_ap: { base_address: 0x00000000, latency: 8, apreg_access_wait: 12, apmem_access_wait: 16 }
         
     | 
| 
      
 106 
     | 
    
         
            +
              mem2_ap: { base_address: 0x10000000, latency: 8, apreg_access_wait: 12, apmem_access_wait: 16 }
         
     | 
| 
      
 107 
     | 
    
         
            +
            }
         
     | 
| 
      
 108 
     | 
    
         
            +
            sub_block :arm_debug, class_name: 'OrigenARMDebug::DAP', mem_aps: mem_aps
         
     | 
| 
      
 109 
     | 
    
         
            +
            ~~~
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
      
 111 
     | 
    
         
            +
            When used with the JTAG physical driver these are the default IR size 4 and the default register select values are:
         
     | 
| 
      
 112 
     | 
    
         
            +
             
     | 
| 
      
 113 
     | 
    
         
            +
            ~~~
         
     | 
| 
      
 114 
     | 
    
         
            +
            idcode_select = 0b1110
         
     | 
| 
      
 115 
     | 
    
         
            +
            abort_select  = 0b1000
         
     | 
| 
      
 116 
     | 
    
         
            +
            dpacc_select  = 0b1010
         
     | 
| 
      
 117 
     | 
    
         
            +
            apacc_select  = 0b1011
         
     | 
| 
      
 118 
     | 
    
         
            +
            ~~~
         
     | 
| 
      
 119 
     | 
    
         
            +
             
     | 
| 
      
 120 
     | 
    
         
            +
            You can set non-default values at instantiation like this:
         
     | 
| 
      
 121 
     | 
    
         
            +
             
     | 
| 
      
 122 
     | 
    
         
            +
            ~~~ruby
         
     | 
| 
      
 123 
     | 
    
         
            +
            mem_aps = {
         
     | 
| 
      
 124 
     | 
    
         
            +
              mem_ap: { base_address: 0x00000000 }
         
     | 
| 
      
 125 
     | 
    
         
            +
              mem2_ap: { base_address: 0x10000000 }
         
     | 
| 
      
 126 
     | 
    
         
            +
            }
         
     | 
| 
      
 127 
     | 
    
         
            +
            instantiation_options[:class_name] = 'OrigenARMDebug::DAP'
         
     | 
| 
      
 128 
     | 
    
         
            +
            instantiation_options[:mem_aps] = mem_aps
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
            instantiation_options[:ir_size] = 8
         
     | 
| 
      
 131 
     | 
    
         
            +
            instantiation_options[:idcode_select] = 0xFE
         
     | 
| 
      
 132 
     | 
    
         
            +
            instantiation_options[:abort_select] = 0xF8
         
     | 
| 
      
 133 
     | 
    
         
            +
            instantiation_options[:dpacc_select] = 0xFA
         
     | 
| 
      
 134 
     | 
    
         
            +
            instantiation_options[:apacc_select] = 0xFB
         
     | 
| 
      
 135 
     | 
    
         
            +
             
     | 
| 
      
 136 
     | 
    
         
            +
            sub_block :arm_debug, instantiation_options
         
     | 
| 
      
 137 
     | 
    
         
            +
            ~~~
         
     | 
| 
      
 138 
     | 
    
         
            +
             
     | 
| 
      
 139 
     | 
    
         
            +
            ### Company Customization
         
     | 
| 
      
 140 
     | 
    
         
            +
             
     | 
| 
      
 141 
     | 
    
         
            +
            It may be the case that your application needs additional, customized Access Ports (AP) which are allowed but
         
     | 
| 
      
 142 
     | 
    
         
            +
            not defined by the standard ARM Debug Interface.  The following example shows how you can use the generic AP
         
     | 
| 
      
 143 
     | 
    
         
            +
            class as a starting point and add extra registers as defined by your specific implementation.
         
     | 
| 
      
 144 
     | 
    
         
            +
             
     | 
| 
      
 145 
     | 
    
         
            +
            ~~~ruby
         
     | 
| 
      
 146 
     | 
    
         
            +
            require 'origen_arm_debug'
         
     | 
| 
      
 147 
     | 
    
         
            +
            module ARMDebugCOMPANY
         
     | 
| 
      
 148 
     | 
    
         
            +
              # New AP class inherited from generic AP class provided by origen_arm_debug
         
     | 
| 
      
 149 
     | 
    
         
            +
              class CustomAP < OrigenARMDebug::AP
         
     | 
| 
      
 150 
     | 
    
         
            +
                # Initialize AP parameters and registers
         
     | 
| 
      
 151 
     | 
    
         
            +
                def initialize(options = {})
         
     | 
| 
      
 152 
     | 
    
         
            +
                  super
         
     | 
| 
      
 153 
     | 
    
         
            +
             
     | 
| 
      
 154 
     | 
    
         
            +
                  instantiate_registers(options)
         
     | 
| 
      
 155 
     | 
    
         
            +
             
     | 
| 
      
 156 
     | 
    
         
            +
                  # Standard AP-register latency for most devices.  Can be overriden by
         
     | 
| 
      
 157 
     | 
    
         
            +
                  #   top-level if necessary
         
     | 
| 
      
 158 
     | 
    
         
            +
                  @apreg_access_wait = 8
         
     | 
| 
      
 159 
     | 
    
         
            +
                end
         
     | 
| 
      
 160 
     | 
    
         
            +
             
     | 
| 
      
 161 
     | 
    
         
            +
                # Add example registers associated with CustomAP.
         
     | 
| 
      
 162 
     | 
    
         
            +
                # 
         
     | 
| 
      
 163 
     | 
    
         
            +
                # Custom registers can also be added by ARMDebug owner with add_reg or
         
     | 
| 
      
 164 
     | 
    
         
            +
                #   overloading entire instantiate_registers methd
         
     | 
| 
      
 165 
     | 
    
         
            +
                #
         
     | 
| 
      
 166 
     | 
    
         
            +
                #   Ex:  arm_debug.company_ap.add_reg(:custom_reg_3, 0x08)
         
     | 
| 
      
 167 
     | 
    
         
            +
                def instantiate_registers(options = {})
         
     | 
| 
      
 168 
     | 
    
         
            +
                  add_reg :custom_reg_1, 0x00
         
     | 
| 
      
 169 
     | 
    
         
            +
                  add_reg :custom_reg_2, 0x04
         
     | 
| 
      
 170 
     | 
    
         
            +
                end
         
     | 
| 
      
 171 
     | 
    
         
            +
              end
         
     | 
| 
      
 172 
     | 
    
         
            +
            end
         
     | 
| 
      
 173 
     | 
    
         
            +
             
     | 
| 
      
 174 
     | 
    
         
            +
             
     | 
| 
      
 175 
     | 
    
         
            +
            class DUT
         
     | 
| 
      
 176 
     | 
    
         
            +
              include Origen::TopLevel
         
     | 
| 
      
 177 
     | 
    
         
            +
              include ARMDebugCOMPANY
         
     | 
| 
      
 178 
     | 
    
         
            +
             
     | 
| 
      
 179 
     | 
    
         
            +
              # Also include the required physical driver, JTAG in this example
         
     | 
| 
      
 180 
     | 
    
         
            +
              include OrigenJTAG
         
     | 
| 
      
 181 
     | 
    
         
            +
             
     | 
| 
      
 182 
     | 
    
         
            +
              def initialize
         
     | 
| 
      
 183 
     | 
    
         
            +
                reg :myreg, 0x0012, size: 16 do |reg|
         
     | 
| 
      
 184 
     | 
    
         
            +
                  reg.bits 15..8, :upper_byte
         
     | 
| 
      
 185 
     | 
    
         
            +
                  reg.bits 7..0,  :lower_byte
         
     | 
| 
      
 186 
     | 
    
         
            +
                end
         
     | 
| 
      
 187 
     | 
    
         
            +
                
         
     | 
| 
      
 188 
     | 
    
         
            +
                # Some standard AP parameters values
         
     | 
| 
      
 189 
     | 
    
         
            +
                std_memap_config = { latency: 16, apreg_access_wait: 8, apmem_access_wait: 8, csw_reset: 0x23000040 }  
         
     | 
| 
      
 190 
     | 
    
         
            +
             
     | 
| 
      
 191 
     | 
    
         
            +
                # 2 MemAPs using standard parameters (above)
         
     | 
| 
      
 192 
     | 
    
         
            +
                mem_aps = {
         
     | 
| 
      
 193 
     | 
    
         
            +
                  mem_ap_0: { base_address: 0x00000000 }.merge(std_memap_config),    # AP Select = 0x00
         
     | 
| 
      
 194 
     | 
    
         
            +
                  mem_ap_1: { base_address: 0x01000000 }.merge(std_memap_config),    # AP Select = 0x01
         
     | 
| 
      
 195 
     | 
    
         
            +
                }
         
     | 
| 
      
 196 
     | 
    
         
            +
             
     | 
| 
      
 197 
     | 
    
         
            +
                # Add Company-Customized AP class @ APSEL = 0x04
         
     | 
| 
      
 198 
     | 
    
         
            +
                custom_ap = {
         
     | 
| 
      
 199 
     | 
    
         
            +
                  company_ap:  { class_name: 'ARMDebugCOMPANY::CustomAP', base_address: 0x04000000, apreg_access_wait: 8 }
         
     | 
| 
      
 200 
     | 
    
         
            +
                }
         
     | 
| 
      
 201 
     | 
    
         
            +
             
     | 
| 
      
 202 
     | 
    
         
            +
                sub_block :arm_debug, class_name: 'OrigenARMDebug::DAP',
         
     | 
| 
      
 203 
     | 
    
         
            +
                                      base_address: 0,
         
     | 
| 
      
 204 
     | 
    
         
            +
                                      mem_aps: mem_aps,
         
     | 
| 
      
 205 
     | 
    
         
            +
                                      aps: custom_ap
         
     | 
| 
      
 206 
     | 
    
         
            +
              end
         
     | 
| 
      
 207 
     | 
    
         
            +
            end
         
     | 
| 
      
 208 
     | 
    
         
            +
            DUT.new.arm_debug.company_ap.custom_reg_1.write!(0x55AA)
         
     | 
| 
      
 209 
     | 
    
         
            +
            ~~~
         
     | 
| 
      
 210 
     | 
    
         
            +
             
     | 
| 
      
 211 
     | 
    
         
            +
            ### How To Setup a Development Environment
         
     | 
| 
      
 212 
     | 
    
         
            +
             
     | 
| 
      
 213 
     | 
    
         
            +
            [Clone the repository from Github](https://github.com/Origen-SDK/origen_arm_debug).
         
     | 
| 
      
 214 
     | 
    
         
            +
             
     | 
| 
      
 215 
     | 
    
         
            +
            An instance of the OrigenARMDebug driver is hooked up to a dummy DUT
         
     | 
| 
      
 216 
     | 
    
         
            +
            object for use in the console:
         
     | 
| 
      
 217 
     | 
    
         
            +
             
     | 
| 
      
 218 
     | 
    
         
            +
            ~~~
         
     | 
| 
      
 219 
     | 
    
         
            +
            origen i
         
     | 
| 
      
 220 
     | 
    
         
            +
             
     | 
| 
      
 221 
     | 
    
         
            +
            > dut.arm_debug
         
     | 
| 
      
 222 
     | 
    
         
            +
            => #<OrigenARMDebug::Driver:0x0000001ee48e78>
         
     | 
| 
      
 223 
     | 
    
         
            +
            ~~~
         
     | 
| 
      
 224 
     | 
    
         
            +
             
     | 
| 
      
 225 
     | 
    
         
            +
            Follow the instructions here if you want to make a 3rd party app
         
     | 
| 
      
 226 
     | 
    
         
            +
            workspace use your development copy of the OrigenARMDebug plugin:
         
     | 
| 
      
 227 
     | 
    
         
            +
            [Setting up a Plugin Development Environment](http://origen-sdk.org/origen/guides/plugins)
         
     | 
| 
      
 228 
     | 
    
         
            +
             
     | 
| 
      
 229 
     | 
    
         
            +
            This plugin also contains a test suite, makes sure this passes before committing
         
     | 
| 
      
 230 
     | 
    
         
            +
            any changes!
         
     | 
| 
      
 231 
     | 
    
         
            +
             
     | 
| 
      
 232 
     | 
    
         
            +
            ~~~
         
     | 
| 
      
 233 
     | 
    
         
            +
            origen examples
         
     | 
| 
      
 234 
     | 
    
         
            +
            ~~~
         
     | 
| 
      
 235 
     | 
    
         
            +
             
     | 
| 
      
 236 
     | 
    
         
            +
            <%= disqus_comments %>
         
     | 
| 
      
 237 
     | 
    
         
            +
             
     | 
| 
      
 238 
     | 
    
         
            +
            % end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: origen_arm_debug
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1.0 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.1.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Ronnie Lajaunie
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date:  
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2018-02-14 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: origen
         
     | 
| 
         @@ -101,6 +101,7 @@ files: 
     | 
|
| 
       101 
101 
     | 
    
         
             
            - lib/origen_arm_debug_dev/dut_swd.rb
         
     | 
| 
       102 
102 
     | 
    
         
             
            - pattern/workout.rb
         
     | 
| 
       103 
103 
     | 
    
         
             
            - templates/web/index.md.erb
         
     | 
| 
      
 104 
     | 
    
         
            +
            - templates/web/index.md.erb~
         
     | 
| 
       104 
105 
     | 
    
         
             
            - templates/web/layouts/_basic.html.erb
         
     | 
| 
       105 
106 
     | 
    
         
             
            - templates/web/partials/_navbar.html.erb
         
     | 
| 
       106 
107 
     | 
    
         
             
            - templates/web/release_notes.md.erb
         
     | 
| 
         @@ -130,3 +131,4 @@ specification_version: 4 
     | 
|
| 
       130 
131 
     | 
    
         
             
            summary: Provides an Origen API to perform register read and write operations via
         
     | 
| 
       131 
132 
     | 
    
         
             
              the ARM_DEBUG protocol.
         
     | 
| 
       132 
133 
     | 
    
         
             
            test_files: []
         
     | 
| 
      
 134 
     | 
    
         
            +
            has_rdoc: 
         
     |