§
    º³Ùg2  ã                   óº   — d Z ddlmZmZmZ ddlmZmZ  G d„ de¦  «        Z	 G d„ de¦  «        Z
 G d„ d	e¦  «        Z G d
„ de¦  «        Zdeeef         fd„ZdS )a›  
Stylesheet for pulse drawer.

The stylesheet `QiskitPulseStyle` is initialized with the hard-corded default values in
`default_style`. This instance is generated when the pulse drawer module is loaded so that
every lower modules can access to the information.

The `QiskitPulseStyle` is a wrapper class of python dictionary with the structured keys
such as `formatter.color.fill_waveform_d` to represent a color code of the drive channel.
This key representation and initialization framework are the imitative of
`rcParams` of `matplotlib`. However, the `QiskitPulseStyle` is not compatible with the `rcParams`
because the pulse stylesheet is heavily specialized to the context of the pulse program.

The settings of stylesheet are broadly separated into `formatter`, `generator` and `layout`.
The formatter is a nested dictionary of drawing parameters to control the appearance of
each visualization element. This takes similar data structure to the `rcParams` of `matplotlib`.
The generator is a list of callback functions that generates drawing objects from
given program and device data. The layout is a callback function that determines
the appearance of the output image.
é    )ÚDictÚAnyÚMapping)Ú
generatorsÚlayoutsc                   óˆ   ‡ — e Zd ZdZˆ fd„Zdeeef         ddfˆ fd„Ze	d„ ¦   «         Z
e	d„ ¦   «         Ze	d	„ ¦   «         Zˆ xZS )
ÚQiskitPulseStylezStylesheet for pulse drawer.c                 ó˜   •— t          ¦   «                              ¦   «          d | _        |                      t	          ¦   «         ¦  «         d S ©N)ÚsuperÚ__init__Ú
stylesheetÚupdateÚdefault_style)ÚselfÚ	__class__s    €ú^/granary/edev/quantum/lib/python3.11/site-packages/qiskit/visualization/pulse_v2/stylesheet.pyr   zQiskitPulseStyle.__init__)   s<   ø€ Ý‰Œ×ÒÑÔÐàˆŒØ�Š•M‘O”OÑ$Ô$Ð$Ð$Ð$ó    Ú_QiskitPulseStyle__mÚreturnNc                 ó¾   •—  t          ¦   «         j        |fi |¤Ž |                     ¦   «         D ]\  }}|                      ||¦  «         Œ|j        j        | _        d S r   )r   r   ÚitemsÚ__setitem__r   Ú__name__r   )r   r   ÚkwargsÚkeyÚvaluer   s        €r   r   zQiskitPulseStyle.update/   se   ø€ Ø�‰ŒŒ�sÐ%Ð%˜fÐ%Ð%Ð%ØŸ)š)™+œ+ð 	)ð 	)‰JˆC�Ø×Ò˜S %Ñ(Ô(Ð(Ð(Øœ-Ô0ˆŒˆˆr   c                 óÀ   — i }|                       ¦   «         D ]F\  }}|                     d¦  «        }|d         dk    r ||d                     |dd…         ¦  «        <   ŒG|S )z+Return formatter field of style dictionary.ú.r   Ú	formatteré   N©r   ÚsplitÚjoin©r   Úsub_dictr   r   Úsub_keyss        r   r    zQiskitPulseStyle.formatter5   óf   € ð ˆØŸ*š*™,œ,ð 	9ð 	9‰JˆC�Ø—y’y ‘~”~ˆHØ˜Œ{˜kÒ)Ð)Ø38�˜Ÿš (¨1¨2¨2¤,Ñ/Ô/Ñ0øØˆr   c                 óÀ   — i }|                       ¦   «         D ]F\  }}|                     d¦  «        }|d         dk    r ||d                     |dd…         ¦  «        <   ŒG|S )z+Return generator field of style dictionary.r   r   Ú	generatorr!   Nr"   r%   s        r   r*   zQiskitPulseStyle.generator?   r(   r   c                 óÀ   — i }|                       ¦   «         D ]F\  }}|                     d¦  «        }|d         dk    r ||d                     |dd…         ¦  «        <   ŒG|S )z(Return layout field of style dictionary.r   r   Úlayoutr!   Nr"   r%   s        r   r,   zQiskitPulseStyle.layoutI   sf   € ð ˆØŸ*š*™,œ,ð 	9ð 	9‰JˆC�Ø—y’y ‘~”~ˆHØ˜Œ{˜hÒ&Ð&Ø38�˜Ÿš (¨1¨2¨2¤,Ñ/Ô/Ñ0øØˆr   )r   Ú
__module__Ú__qualname__Ú__doc__r   r   Ústrr   r   Úpropertyr    r*   r,   Ú__classcell__©r   s   @r   r	   r	   &   sÄ   ø€ € € € € Ø&Ð&ð%ð %ð %ð %ð %ð1˜' # s (Ô+ð 1¸$ð 1ð 1ð 1ð 1ð 1ð 1ð ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð ð ð ð r   r	   c                   ó(   ‡ — e Zd ZdZˆ fd„Zd„ Zˆ xZS )ÚIQXStandarda‰  Standard pulse stylesheet.

    - Generate stepwise waveform envelope with latex pulse names.
    - Apply phase modulation to waveforms.
    - Plot frame change symbol with formatted operand values.
    - Show chart name with scaling factor.
    - Show snapshot and barrier.
    - Do not show acquire channels.
    - Channels are sorted by index and control channels are added to the end.
    c                 ó°  •— t          ¦   «                              ¦   «          ddddddt          j        t          j        gt          j        t          j        gt          j        t          j        t          j	        gt          j
        gt          j        gt          j        t          j        t          j        dœ} |j        di |¤Ž |                      |¦  «         d S ©NTF)ú(formatter.control.apply_phase_modulationú'formatter.control.show_snapshot_channelú&formatter.control.show_acquire_channelú$formatter.control.show_empty_channelú$formatter.control.auto_chart_scalingúformatter.control.axis_breakúgenerator.waveformúgenerator.frameúgenerator.chartúgenerator.snapshotúgenerator.barrierúlayout.chart_channel_mapúlayout.time_axis_mapúlayout.figure_title© )r   r   r   Úgen_filled_waveform_stepwiseÚgen_ibmq_latex_waveform_nameÚgen_frame_symbolÚgen_formatted_frame_valuesÚgen_chart_nameÚgen_baselineÚgen_channel_freqsÚgen_snapshot_symbolÚgen_barrierr   Úchannel_index_grouped_sort_uÚtime_map_in_nsÚdetail_titler   ©r   r   Ústyler   s      €r   r   zIQXStandard.__init__`   sÇ   ø€ Ý‰Œ×ÒÑÔÐà8<Ø7;Ø6;Ø49Ø48Ø,0åÔ7ÝÔ7ð#õ !+Ô ;½ZÔ=bÐcåÔ)ÝÔ'ÝÔ,ð õ
 $.Ô#AÐ"BÝ",Ô"8Ð!9Ý(/Ô(LÝ$+Ô$:Ý#*Ô#7ð+
ð 
ˆð. 	ˆŒÐÐ�vÐÐÐØ�Š�EÑÔÐÐÐr   c                 ó   — dS )NzStandard Pulse style sheet.rF   ©r   s    r   Ú__repr__zIQXStandard.__repr__|   s   € Ø,Ð,r   ©r   r-   r.   r/   r   rW   r2   r3   s   @r   r5   r5   T   sQ   ø€ € € € € ð	ð 	ðð ð ð ð ð8-ð -ð -ð -ð -ð -ð -r   r5   c                   ó(   ‡ — e Zd ZdZˆ fd„Zd„ Zˆ xZS )Ú	IQXSimpleaR  Simple pulse stylesheet without channel notation.

    - Generate stepwise waveform envelope with latex pulse names.
    - Apply phase modulation to waveforms.
    - Do not show frame changes.
    - Show chart name.
    - Do not show snapshot and barrier.
    - Do not show acquire channels.
    - Channels are sorted by qubit index.
    c                 óD  •— t          ¦   «                              ¦   «          dddddddt          j        t          j        gg t          j        t          j        gg g t          j        t          j	        t          j
        dœ} |j        di |¤Ž |                      |¦  «         d S )Né   TF)ú"formatter.general.fig_chart_heightr8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   )r   r   r   rG   rH   rK   rL   r   Úqubit_index_sortrQ   Úempty_titler   rS   s      €r   r   zIQXSimple.__init__Œ   s¨   ø€ Ý‰Œ×ÒÑÔÐà23Ø8<Ø7;Ø6;Ø49Ø49Ø,0åÔ7ÝÔ7ð#ð  "Ý *Ô 9½:Ô;RÐSØ"$Ø!#Ý(/Ô(@Ý$+Ô$:Ý#*Ô#6ð%
ð 
ˆð( 	ˆŒÐÐ�vÐÐÐØ�Š�EÑÔÐÐÐr   c                 ó   — dS )Nz)Simple pulse style sheet for publication.rF   rV   s    r   rW   zIQXSimple.__repr__¥   s   € Ø:Ð:r   rX   r3   s   @r   rZ   rZ   €   sQ   ø€ € € € € ð	ð 	ðð ð ð ð ð2;ð ;ð ;ð ;ð ;ð ;ð ;r   rZ   c                   ó(   ‡ — e Zd ZdZˆ fd„Zd„ Zˆ xZS )ÚIQXDebuggingaù  Pulse stylesheet for pulse programmers. Show details of instructions.

    # TODO: add more generators

    - Generate stepwise waveform envelope with latex pulse names.
    - Generate annotation for waveform height.
    - Apply phase modulation to waveforms.
    - Plot frame change symbol with raw operand values.
    - Show chart name and channel frequency.
    - Show snapshot and barrier.
    - Show acquire channels.
    - Channels are sorted by index and control channels are added to the end.
    c                 óÜ  •— t          ¦   «                              ¦   «          ddddddt          j        t          j        t          j        gt          j        t          j        gt          j        t          j	        t          j
        gt          j        t          j        gt          j        gt          j        t          j        t          j        dœ} |j        di |¤Ž |                      |¦  «         d S r7   )r   r   r   rG   rH   Úgen_waveform_max_valuerI   Úgen_raw_operand_values_compactrK   rL   rM   rN   Úgen_snapshot_namerO   r   rP   rQ   rR   r   rS   s      €r   r   zIQXDebugging.__init__¸   s×   ø€ Ý‰Œ×ÒÑÔÐà8<Ø7;Ø6:Ø49Ø48Ø,0åÔ7ÝÔ7ÝÔ1ð#õ Ô+ÝÔ9ð õ
 Ô)ÝÔ'ÝÔ,ð õ
 $.Ô#AÅ:ÔC_Ð"`Ý",Ô"8Ð!9Ý(/Ô(LÝ$+Ô$:Ý#*Ô#7ð3
ð 
ˆð6 	ˆŒÐÐ�vÐÐÐØ�Š�EÑÔÐÐÐr   c                 ó   — dS )Nz(Pulse style sheet for pulse programmers.rF   rV   s    r   rW   zIQXDebugging.__repr__Ø   s   € Ø9Ð9r   rX   r3   s   @r   rb   rb   ©   sR   ø€ € € € € ðð ðð ð ð ð ð@:ð :ð :ð :ð :ð :ð :r   rb   r   c                  óò  — i dd“dd“dd“dd“d	d
dgd
dgddgddgddgdœ“dd“dd“dd“dd“dd“dd“dd“dd“dddg“dd“dd “d!d"“i d#d"“d$d%“d&d'“d(d'“d)d*“d+d*“d,d-“d.d/“d0d1“d2d3“d4d3“d5d6“d7d6“d8d3“d9d“d:d“d;d“¥i d<d“d=d>“d?d@“dAdB“dCdB“dDd>“dEd>“dFdG“dHd1“dId'“dJd'“dKd'“dLdM“dNdM“dOdP“dQdR“dSd “¥i dTd “dUd “dVd “dWdX“dYdZ“d[d\“d]d3“d^d_“d`da“dbdc“dddc“dedc“dfdc“dgdc“dhdc“didc“djdk“¥dldmdndodpdqdng g g g g drdrdrdsœ¥S )tz.Define default values of the pulse stylesheet.zformatter.general.fig_widthé   r]   g      ø?z%formatter.general.vertical_resolutiong�íµ ÷Æ°>zformatter.general.max_scaleéd   zformatter.color.waveformsz#648fffz#002999z#ffb000z#994A00z#dc267fz#760019)ÚWÚDÚUÚMÚAzformatter.color.baselinez#000000zformatter.color.barrierz#222222zformatter.color.backgroundz#f2f3f4zformatter.color.fig_titlezformatter.color.annotatezformatter.color.frame_changezformatter.color.snapshotzformatter.color.axis_labelzformatter.color.opaque_shapezformatter.alpha.fill_waveformg333333Ó?zformatter.alpha.baselineg      ð?zformatter.alpha.barriergffffffæ?zformatter.alpha.opaque_shapezformatter.layer.fill_waveformé   zformatter.layer.baseliner!   zformatter.layer.barrierzformatter.layer.annotater\   zformatter.layer.axis_labelzformatter.layer.frame_changeé   zformatter.layer.snapshoté   zformatter.layer.fig_titleé   zformatter.margin.topg      à?zformatter.margin.bottomzformatter.margin.left_percentgš™™™™™©?zformatter.margin.right_percentz formatter.margin.between_channelz!formatter.label_offset.pulse_namez!formatter.label_offset.chart_infoz#formatter.label_offset.frame_changezformatter.label_offset.snapshotzformatter.text_size.axis_labelé   zformatter.text_size.annotateé   z formatter.text_size.frame_changeé   zformatter.text_size.snapshotzformatter.text_size.fig_titlez%formatter.text_size.axis_break_symbolz"formatter.line_width.fill_waveformr   zformatter.line_width.axis_breakzformatter.line_width.baselinezformatter.line_width.barrierz!formatter.line_width.opaque_shapez"formatter.line_style.fill_waveformú-zformatter.line_style.baselinezformatter.line_style.barrierú:z!formatter.line_style.opaque_shapez--zformatter.channel_scaling.drivez!formatter.channel_scaling.controlz!formatter.channel_scaling.measurez!formatter.channel_scaling.acquirez%formatter.channel_scaling.pos_spacinggš™™™™™¹?z%formatter.channel_scaling.neg_spacinggš™™™™™¹¿z formatter.box_width.opaque_shapeé–   z!formatter.box_height.opaque_shapezformatter.axis_break.lengthi¸  zformatter.axis_break.max_lengthiè  zformatter.control.fill_waveformTr8   r9   r:   r;   r<   r=   z%formatter.unicode_symbol.frame_changeu   â†ºu   â†¯u   Î¸Úfz\circlearrowleftÚ z\thetaN)z!formatter.unicode_symbol.snapshotz(formatter.unicode_symbol.phase_parameterz'formatter.unicode_symbol.freq_parameterz#formatter.latex_symbol.frame_changezformatter.latex_symbol.snapshotz&formatter.latex_symbol.phase_parameterz%formatter.latex_symbol.freq_parameterr>   r?   r@   rA   rB   rC   rD   rE   rF   rF   r   r   r   r   Ü   sp  € ðZØ% rðZà,¨cðZð 	0°ðZð 	& sð	Zð
 	$Ø˜YÐ'Ø˜YÐ'Ø˜YÐ'Ø˜YÐ'Ø˜YÐ'ð&
ð &
ðZð 	# IðZð 	" 9ðZð 	% iðZð 	$ YðZð  	# Ið!Zð" 	'¨	ð#Zð$ 	# Ið%Zð& 	% ið'Zð( 	'¨°IÐ(>ð)Zð* 	(¨ð+Zð, 	# Cð-Zð. 	" 3ð/Zð Zð0 	'¨ð1Zð2 	(¨ð3Zð4 	# Að5Zð6 	" 1ð7Zð8 	# Að9Zð: 	% að;Zð< 	'¨ð=Zð> 	# Að?Zð@ 	$ QðAZðB 	 ðCZðD 	" 3ðEZðF 	(¨ðGZðH 	)¨$ðIZðJ 	+¨CðKZðL 	,¨SðMZðN 	,¨SðOZðP 	.¨sðQZð Zð ZðR 	*¨3ðSZðT 	)¨"ðUZðV 	'¨ðWZðX 	+¨BðYZðZ 	'¨ð[Zð\ 	(¨ð]Zð^ 	0°ð_Zð` 	-¨aðaZðb 	*¨1ðcZðd 	(¨ðeZðf 	'¨ðgZðh 	,¨QðiZðj 	-¨cðkZðl 	(¨ðmZðn 	'¨ðoZðp 	,¨TðqZðr 	*¨3ðsZð Zð Zðt 	,¨SðuZðv 	,¨SðwZðx 	,¨SðyZðz 	0°ð{Zð| 	0°ð}Zð~ 	+¨CðZð@ 	,¨SðAZðB 	& tðCZðD 	*¨4ðEZðF 	*¨4ðGZðH 	3°DðIZðJ 	2°4ðKZðL 	1°$ðMZðN 	/°ðOZðP 	/°ðQZðR 	'¨ðSZðT 	0°ðUZð ZðV .6Ø4<Ø36Ø/BØ+-Ø2;Ø14Ø ØØØ ØØ$(Ø $Ø#ðsZð Zð Zð Zr   N)r/   Útypingr   r   r   Úqiskit.visualization.pulse_v2r   r   Údictr	   r5   rZ   rb   r0   r   rF   r   r   ú<module>r      s'  ððð ð* &Ð %Ð %Ð %Ð %Ð %Ð %Ð %Ð %Ð %Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =ð+ð +ð +ð +ð +�tñ +ô +ð +ð\)-ð )-ð )-ð )-ð )-�$ñ )-ô )-ð )-ðX&;ð &;ð &;ð &;ð &;�ñ &;ô &;ð &;ðR0:ð 0:ð 0:ð 0:ð 0:�4ñ 0:ô 0:ð 0:ðf\�t˜C ˜H”~ð \ð \ð \ð \ð \ð \r   