text: import numpy as np
  import matplotlib.pyplot as plt
  from viznet import DynamicShow, QuantumCircuit
  from viznet import parsecircuit as _
  
  def diffcircuit():
      '''illustration of block-focus scheme.'''
      num_bit = 4
      depth = 3
      with DynamicShow((10, 4), '_differentiable.png') as ds:
          plt.text(5, -4, "Differentiable Circuit of Size 4, depth 2")
          handler = QuantumCircuit(num_bit=num_bit)
          handler.x += 1.0
          with handler.block(slice(0, num_bit-1), pad_x=0.2, pad_y=0.1) as b:
              rot_gate(handler, 1, mask=[0,1,1])
          b[0].text('Rotation', 'top')
          handler.x += 1.0
          # entangler block
          with handler.block(slice(0, num_bit-1), pad_x=0, pad_y = 0.1) as b:
              entangle_gate(handler)
          b[0].text('Entangler', 'top')
  
          for i in range(depth-2):
              handler.x += 1.0
              rot_gate(handler, 2, mask=[1,1,1])
              handler.x += 1.0
              entangle_gate(handler)
          handler.x += 1.0
          rot_gate(handler, 3, mask=[1,1,0])
  
          handler.x += 1.0
          for i in range(num_bit):
              handler.gate(_.MEASURE, i)
          handler.edge.style = '='
          handler.x += 0.8
          for i in range(num_bit):
              handler.gate(_.END, i)
  
          # text |0>s
          for i in range(num_bit):
              plt.text(-0.5, -i, r'$\left\vert0\right\rangle$'
                       , va='center', ha='center', fontsize=16)
  
  def rot_gate(handler, l, mask=[True]*3):
      gates = ['Rz', 'Rx', 'Rz']
      for j, name in enumerate(gates):
          if not mask[j]: continue
          for i in range(handler.num_bit):
              handler.gate(_.WIDE, i, r'%s($\eta_%d^{%s}$)'%(name, l, chr(ord('a')+i*3+j)), fontsize=10)
          handler.x+=1.2
      if any(mask): handler.x-=1.2
  
  def entangle_gate(handler):
      for i,j in [(1,2), (3,4)]:
          handler.gate((_.C, _.NOT), (i-1, j-1))
      handler.x += 0.7
      for i,j in [(1,2)]:
          handler.gate((_.C, _.NOT), (i, j%6))
      handler.x += 0.7
      handler.gate((_.C, _.NOT), (3, 0))
  
  if __name__ == '__main__':
      diffcircuit()
  