Tuesday, February 15, 2022

Valentines' Day 2022: AMD Acquires Xilinx

AMD Acquires Xilinx

Valentines' Day 2022 witnessed the completion of AMD's acquisition of Xilinx.
It's also my day one with AMD as a Xilinx employee and I felt a strong urge to write down something to mark this day.
This something certainly can't be a technical topic, then what to write?
Recalled it's an all-stock-no-cash acquisition, I thought it could be fun to dig into this CP's stock market past performances.
One of the stories I heard long time ago is about a guy who made a great fortune and was said planning to woo a young but not very rich lady. However, nobody really saw any moves from him and the rumors eventually died down. Half decades later, the same young lady made a big fortune and became much richer than that guy. She, instead of hesitation, proposed to this guy straight away with a great success!
Fancying about happy fairy tales sharing similar story lines, I pulled the historical market values and daily stock prices of AMD and Xilinx (start with the date when AMD appointed Lisa as CEO to take the helm) from the Internet and plotted them on the same chart. Guess what! the stock prices of both companies bear more similarities than differences! And indeed that the guy is much richer than the lady to begin with. Looking at the historical daily stock price, there is a great correlation with a coefficient of 0.93.
A born couple?! 😍
Anyway, on 14, Feb. 2022, AMD and Xilinx united as one! 💕
Together, we advance! 🚀
Go AMD! 💪




Saturday, January 29, 2022

Transmitter FIR Output Waveform Simulation

Transmitter FIR Output Waveform Simulation
3-tap TX FIR

In this notebook, a step-by-step walk through of a 3-tap TX FIR output waveform generation is done to demonstrate the very basic concepts of TX FIR and its impact to signals going through channels. Useful codes are packed into helper functions to be reused in the future to futher explore automatic channel adaptation schemes such as TX FIR, FFE, RX CTLE and DFE etc.




Saturday, January 1, 2022

From S-parameters to Eye Diagrams

From S-parameters to Eye Diagrams
S-parameter to eye diagram
WishinwalHappyHealthyWealthanProsperouYeao2022!

In this notebook, I briefly walked through a bare minimum serial link simulation procedure and demonstrated each step in python for:

  • Remote site S-parameter file loading, pre-processing and system impulse response(IR) extraction
  • IR to single-bit-response (SBR) conversion (where IR is the general system impulse response of the channel while SBR is the output of the single-bit input after going through the channel which is data-rate dependent)
  • Transient simulation through time domain 1d convolution (pay attention to the numpy and the scipy output differences in function call convolve(a,v,"same") mode)
  • Simple and fancier eye diagram plots

Acknowledgment: rainbow text generation tool provided by Rainbow Text Generator Multi Color Text.




Saturday, November 27, 2021

S-parameter conversion and visualization
S-parameters

It's a common practice for RF, microwave and high speed design engineers to pre-process and validate the scattering parameters (S-parameters) reciprocity, passivity and causality before proceed to use it. This notebook will walk through a sample implementation in python to show a simple way of S-parameter manipulation and plot to provide a quick examination through visual inspection. It will cover the following steps:

  • load a sample 4-port S-parameter file hosted on the Internet (load file through its URL)
  • single-ended S-parameter to mixed-mode conversion
  • Output magnitude in dB for specific measured frequency points of interest
  • Insertion loss plot for report and visual inspection quality check purposes




Saturday, July 17, 2021

PRBS13Q and pre-coded PAM4 test pattern generation

PRBS13Q Include contents generated by interactive python notebook in the Blogger post is more difficult than I had thought. Although there are so many suggested solutions out there on the web, it doesn't really work for me. Whether it's a hacking into the particular post template to include the Javascript, or customization of the CSS to display nbconvert created html simply doesn't apply as my Blogger account doesn't even have that "Template" or "Advanced CSS" feature enabled for some reason. Probably because it's a free version, thus only providing bare minimum capabilities? Anyway, after surfing the net for a while, I came out the following procedure through trial and error as a workaround:
  • Upload the ipynb file to gist and create the link as suggested by some of the proposed solutions.
  • Manual create a simple html file and embed the gist link in-between the <body></body>.
  • Create post in "html" instead of "component" view.
  • Preview and publish.
Here comes my first notebook post: not very satisfied, but readable.

Friday, January 31, 2014

Spectrum Analyzer Based Phase Noise/Jitter Measurement with Golden PLL in Excel


Demo of the GUI
Today is a big day to all Chinese in the world, the Lunar Chinese New Year, and I’d like to wish all a lucky, happy, healthy and wealthy year of horse ahead!
It’s a time for many Chinese to party and eat to the heart’s content with good excuses to avoid feeling guilty and at the same time make the resolution for the whole new year. More than often, we tend to wait for a “proper” time for the real action to follow for reasons such as “busy to clear things on hand first”, “need to wait for a good chunk of time” and in the end, the chances are "the right time" never comes. But sometimes, if we chose to “slot it in” and “start it now”, we could be amazed at how easy it can be done (relative to what we had thought) and how much we can achieve with small steps a time. The excel sheet to be described can do a lot of things for an engineer who are interested in phase noise and/or jitter measurement. More importantly, the concept can be extended and applied to integrate test and measurement automation with automatic report generation (data post processing and visualization) in Excel. However, it get started only as a simple worksheet to calculate the RMS RJ value from the user supplied phase noise data which took less than 5 minutes to create. It is then fairly easily expanded into what it is now with the capabilities to:
  1. Take in phase noise in “frequency-phase noise” data pairs and calculate the RMS RJ value. This is the spectrum analyzer based clock source random jitter measurement method described in FC-MJSQ and can be used to study the characteristics of different kinds of clock sources.
  2. Pass the phase noise data through PLL and calculate the PLL filtered RMS RJ value. It can be used to study the PLL characteristics and its jitter shaping effect on clock sources.
  3. Pass the phase noise data through PLL first and then a golden PLL. It can be used for transmitter compliance test.
  4. One-button click to perform phase noise measurement from the clock source directly if spectrum analyzer is connected to the host PC through GPIB. This will automate the phase noise raw data acquisition into the Excel instead of manually cut/paste.
  5. One-button click to perform screen capture of the spectrum analyzer for documentation and reporting purposes.
Here is the step-by-step guide on how to make this Excel sheet:

To achieve capability 1:
Cut/paste or import from text-based files such as “*.txt” or “*.csv” for the raw phase noise data into the Excel sheet column A and B and key in the trapezoidal integration equation in column C (start from C3) as shown in Figure 2. You can drag the equation that is filled into C3 all the way down to fill in the column C with the same equation.
Figure 2: trapezoidal integration equation
The summation of column C is the SSB noise power and the RMS phase noise Phi (in unit of radius) is the square root of twice the SSB power, in Excel, Phi = SQRT(2*SUM(C:C)).

To achieve capability 2:
You can calculate the transfer function of your PLL and put the data into column D in dB, the phase noise output through the PLL is simply the addition of raw phase noise and the PLL transfer function in dB and is presented in column E as shown in Figure 3. As an example, the second order PLL transfer function for PCIe described in [1] is used with a 3dB loop bandwidth of 15MHz and a damping factor of 0.54.

Figure 3: TX PLL transfer function
The trapezoidal integration equation is used in column F to calculate the SSB noise power after the raw data goes through the PCIe PLL.
Figure 4: SSB noise power at the TX PLL output

To achieve capability 3:
Use the same method and integration equation as before to implement the first type golden PLL defined in [2]. The completed input is shown in Figure 5 as below.
Figure 5: first type golden PLL transfer function
The SSB noise power for the raw phase noise, the output from (TX) PLL and the output from the golden PLL are calculated and presented in K2 to M2 as shown in Figure 6.
Figure 6: SSB noise power calculation
To make the phase noise/jitter results more presentable, a new sheet is used as GUI with the layout shown in Figure 7, where the phase jitter in second is dependent on the carrier frequency.
Figure 7: calculated phase noise output
At this point, you can also plot all the transfer functions as shown in Figure 8 and the phase noise as shown in Figure 9.
Figure 8: transfer function plots

Figure 9: phase noise plots
To achieve capability 4:
I had thought that this feature could take some time to figure out on how to implement. However, a quick search brings me to the Agilent website, where a very good article is presented on exactly the same topic “Controlling instruments with Excel and the bundled Visual Basic forApplications”.
Of course, I certainly don’t want to hard code the GPIB port and address for the spectrum analyzer. Thus, the input interface as in Figure 10 is provided. Instead of using the cell values directly, the named ranges are used so that when the “GUI” is reformatted, there is no need to change the codes because of the shifting of the cell positions.
Figure 10: named ranges for GPIB interface information
Put a command button onto the Excel sheet and “assign Macros” Button1_Click() as shown below will automate the phase noise data downloading into the Excel.

Sub Button1_Click()
    
    Dim ioMgr As VisaComLib.ResourceManager
    Dim instrument As VisaComLib.FormattedIO488
    Dim idn As String
    Dim lpl() As String
    Dim freq() As Double
    Dim dBc() As Double
    Dim rowStart As Integer
    Dim iLastRow As Long
    Dim lpln As Integer
   
    Set ioMgr = New VisaComLib.ResourceManager
    Set instrument = New VisaComLib.FormattedIO488
    Set instrument.IO = ioMgr.Open(Sheets("MainGUI").Range("gpib_port").Value & "::" &   Sheets("MainGUI").Range("gpib_addr").Value) ‘ this is the same as below line
    'Set instrument.IO = ioMgr.Open("GPIB0::03")
    instrument.IO.Timeout = 10000

    lpln = CInt(Sheets("MainGUI").Range("C11").Value) ‘ provide the option to chose the trace
    instrument.WriteString ":FETC:LPL" & lpln & "?"
    lpl = instrument.ReadList(VisaComLib.IEEEASCIIType.ASCIIType_BSTR, ",")
    instrument.IO.Timeout = 5000
   
    rowStart = 2
    For i = (LBound(lpl)) To (UBound(lpl) - 1) Step 2
        ReDim Preserve freq(0 To i / 2)
        ReDim Preserve dBc(0 To i / 2)
        freq(i / 2) = lpl(i)
        dBc(i / 2) = lpl(i + 1)
    Next i
   
   Sheets("LPLData").Range("A" & rowStart & ":A" & (UBound(dBc) + rowStart)).Value = Application.Transpose(freq)
   Sheets("LPLData").Range("B" & rowStart & ":B" & (UBound(dBc) + rowStart)).Value = Application.Transpose(dBc)
   
    'clear the old f-PN contents
    rowStart = UBound(dBc) + rowStart + 1
    iLastRow = Sheets("LPLData").Cells(Rows.Count, "a").End(xlUp).Row
    Sheets("LPLData").Range("A" & rowStart & ":" & "Z" & iLastRow).Clear
    Call TFCalc  ‘ calculate the transfer function
    Call updatePlots  ‘ update the plots

End Sub

To achieve capability 5:
It’s just one more command button with a little bit more coding. You can look into the codes under Button2_Click() if you are interested.
Of course, it’s handy to add in some more features such as the start/stop frequency so that you have the option to change the frequency span for the phase noise measurement. The option to choose which trace to download: raw data trace or the smoothed data trace. And the flexibility of changing the 3dB cut off frequency of the golden PLL.
By now, we are almost done. As all the raw data are organized into one sheet named “LPLData” and the input/output GUI into another sheet named “MainGUI”, automatically download the phase noise raw data doesn’t pose any issue as it has been taken care of by the Macros. However, manually cut/paste the data from external sources into the Excel sheet may risk overwriting the equations inside the cells, thus corrupting the excel sheet. To avoid this situation, instead of input the equations manually into the Excel sheet, the transfer function calculation and the trapezoidal integration equations have been packed into Macros, making this process fully automated. In addition, an extra Excel sheet named as “PNData” is used for external phase noise data manual input as shown in Figure 12.
Figure 12: phase noise manual input interface

A typical procedure for manually input the phase noise data is outlined in the following:
  1. Navigate to sheet “PNData”, click on “Delete PN Data” to clear old data points.
  2. Copy the external data and paste them into column A and B from row 2 onwards.
  3. Navigate to sheet “MainGUI” and click “Manual PN Data”.  All the calculations will be done automatically with results updated instantly.
The sample code used for PCIe PLL transfer function calculation is given as below:
Function HdB(f3db As Double, zeta As Double, f) As Double
    Dim i As Integer
    Dim n As Double
    Dim d As Double
    Dim w As Double
    Dim w2 As Double
    Dim wn As Double
    Dim H As Double
    w = 2 * Application.WorksheetFunction.Pi() * f 'omega
    w3 = 2 * Application.WorksheetFunction.Pi() * f3db  'omega 2
    wn = w3 / Sqr(1 + 2 * zeta ^ 2 + Sqr((1 + 2 * zeta ^ 2) ^ 2 + 1)) 'omega n
    n = wn * Sqr(wn ^ 2 + 4 * w ^ 2 * zeta ^ 2) 'numorator
    d = Sqr((wn ^ 2 - w ^ 2) ^ 2 + (2 * w * wn * zeta) ^ 2) 'denominator
    H = 20 * Application.WorksheetFunction.Log10(n / d)
    HdB = H
End Function

The finished GUI is shown in Figure 13.
Figure 13: finished GUI

References:
1. PCI ExpressTM Jitter Modeling Revision 1.0RD
2. Fiber Channel - Methodologies for Jitter and Signal Quality Specification - MJSQ 

Saturday, November 10, 2012

Confidence Level and Test Time Excel Calculator at Specified BER and Data Rate

     For those who have the experience of receiver jitter tolerance (RXJTOL) test using a bit error rate tester (BERT) build-in function are mostly likely familiar with the configuration parameters such as the measurement BER depth, confidence level, error gating time or transmitted bits. On the one hand, most of the industry standards will specify these test requirements explicitly such as "test at a BER value of 1E-12 with 95% confidence level" and leave you with no choice but to follow. But some will not specify explicitly, thus you need to make a wise engineering judgement for BER, confidence level settings considering the data rate of the DUT to strike a balance between test accuracy and test time. On the other hand, when there is a requirement of DUT and BERT interactions during the RXJTOL test, you have to write your own test codes instead of using the BERT build-in test function. In this case, you again need to have a good understanding of the relationship among BER, CL, data rate and measured error numbers so that your test algorithm can be properly implemented.

    To serve the above-mentioned purpose without sweat on the mathematics, you can actually make use of some online calculators such as the one from JitterTime. You can input target BER, data rate, measured errors and test time to calculate the confidence level. However, if you has a target CL in mind and want to know the test time or number of bits transmitted, then you need to "play with" the test time iteratively until you hit your CL target if use this online calculator. Alternatively, you need to look at the graph on the same website to find your answer indirectly.

    To make life easier, I implemented similar calculators in Excel based on the same Poisson equation. It not only provides the flexibility of using the calculator without the access of the Internet but also provides the capability of calculating the test time and transmitted number of bits for specific CL targets using bisection root finding method with a 0.01 second accuracy. It can be downloaded here and hopefully can be of some use for you.

    Take note, if you find that the Excel calculator doesn't response to your input. It's most likely because of your Excel disabled the Macro.  If that is the case, you need to enable the Macro by going to "Options..." to "Enable the contents" first.


Sunday, May 20, 2012

Measurement Automation: How to Save Screens of 86100C DCA-J, SDA830 and E4440A/E4445A to Local PC Through GPIB

Picture from agilent.com
Measurement automation can save you a lot of pain in many cases on top of the advantages of higher productivity and greater accuracy in case of performing repeated day-to-day test and measurement tasks. Several examples using simple GPIB commands to capture screen pictures from different instruments to a local PC are given in this article with the complete workable VEE codes shown how to implement. They are easily portable with any programming languages such as Matlab and C or scripts like Perl and Python. If you are interested in how to:

  • Save screen image from Agilent DCA-J 86100C to local PC as GIF files.
  • Save screen image from LeCroy SDA830ZI-A to local PC as PNG files.
  • Save screen image from Agilent E4440A/E4445A spectrum analyzer to local PC as GIF files.
  • Dump raw spectrum data from Agilent E4440A/E4445A spectrum analyzer to local PC as text files.
  • Dump raw phase noise log plot data from Agilent E4440A/E4445A spectrum analyzer to local PC as text files.

Please read on here ...


Saturday, February 11, 2012

Finally, 50G Hz electrical BW with 32Gbps hardware CDR module is available for DCA from Agilent


    I have been looking for high bandwidth, high fidelity CDR modules for high speed (25Gbps and beyond) SerDes characterizations and finally it's here! It is Agilent 86108B Precision Waveform Analyzer which claimed to have "industry best intrinsic jitter below 50 femtoseconds, channel bandwiths to 50GHz, and clock recovery to 32Gbps ...."

If you are interested to know more, "Tips and Techniques for Accurate Characterization of 28Gb/s " is one of their good application notes to start with.

Saturday, August 20, 2011

AC Signal RMS vs. Peak Value

    A lot of times, we need to relate the signal peak-to-peak amplitude to its root-mean-squared value, this is required to understand the system performance impact caused by different aspects of signal characteristics. For example, when you are trying to estimate the maximum current carrying capability of copper traces, wire bonds etc. or how much power the system consumes, how much heat the system generates and need to be dissipated, you could be more interested in signal RMS values while signal peak-to-peak value is of more importance when you are trying to figure out the dielectric break down voltage or device punch through limit and you probably like to consider both parameters when you are interested in not only instantaneous value but also long term averaged power such as complying with IC electromigration design rules.
  
If you are interested, please read the full article here ...




Absolutely legal and free ebooks for downloading from InTechOpen!

I chanced upon the following website which provides FREE ebook downloads.
It's absolutely free! and
Its collections keep increasing with up to date contents!
Take a look now!
http://www.intechopen.com/


Saturday, June 11, 2011

Gaussian PDF, CDF, Error Function and Q-Transformation

How time flies! My blog is six-months' old now and I've been trying to update it with one post per month on average. Contents here may not be fantastic, but all are originally created by myself so far. :)

Original also means the contents are my own understandings, thus may not be 100% correct. This is why I tried to give as more details as possible and attach the sample codes, if any, that used for preparing all the figures presented in the articles. Thus, your comments to correct wrong observations and conclusions, contributions to extend the scope of the articles are certainly warmly welcomed and greatly appreciated.

With that said, let me go back to the fields to continue today's topic: "PDF and CDF of Normal/Gaussian-distributions, Error Function and Q-transformation".


If you are an electrical engineer who want to brush up the very basic statistics that leads to a better understanding of random jitter modeling, dual-Dirac model based DJ, RJ decomposition and jitter extrapolation using bath-tube curve, you may like to read on here ....

You may also have interest in one of my previous articles talking about similar topics: "From Jitter Statistics to System BER"

Or simply look for it in May/2011 archives ...

Sunday, May 15, 2011

From Jitter Statistics to System Bit-Error-Ratio(BER)


A magic factor of 14 is most frequently cited in publications and literature when scale the unbounded system random jitter expressed in terms of its root mean square(RMS) value to the bounded peak-to-peak value at the specified system bit error ratio(BER) value of 1E-12. A good example is its use in the dual-Dirac model to calculate system total jitter from an estimated DJ and RJrms. This article tries to walk through the necessary mathematical equation derivations in detail and understand the physical meanings underlying the general statistical models involved.

The full article can be read here .... 

Saturday, April 16, 2011

Periodic Jitter and Phase Modulation


It's been a while since my last working on this blog. To keep going on, I combed my PC and found some articles written some time ago which may worth sharing here.

Posted here is a topic briefly talking about periodic jitter caused by phase modulation and its extraction from the measured time interval error. The derivation of the analytical form relating the timing error and the signal spectrum is also shown in detail.

If you are interested, please read on ...

Sunday, March 6, 2011

Spectrum analysis of clock-like signals


The purpose of this article is to briefly study the rise/fall time and DCD effects on clock-like signal spectrum. If you are interested, please read on....

Saturday, February 5, 2011

Real-time Oscilloscope Spectrum Analyzer and Matlab


This article is trying to understand a typical clock-like signal measured and interpreted in different domains(time domain and frequency domain) and try to correlate the different results produced from different sources such as measurements, analytical math equations or Matlab functions bridged by Discrete Fourier Transforms(DFT).
   
If you are interested, please read on....

Monday, January 10, 2011

Digital storage oscilloscope‎‎(DSO)‎‎ fundamentals



This article has some equations and I didn't find a proper way of editing them using the blog build-in editor. And after I finished the article in google documents to take advantage of its equation editor function, I failed to find a proper way of publishing it to this blogger. I end up setting up a google website and published the article there through importing....

If you are interested to read this article, please follow the link shown below:


Thursday, January 6, 2011

Perl "for-loop" floating number issue and its solution

Today, a logic error in piece of my newly created Perl code caught my attention. Since similar codes worked well before,  I isolated them for a closer examination. It turned out to be a floating variable comparison issue that may give you unexpected results when used in a for-loop. Below is the sample codes for the debug and illustration purpose.

    print "\n1st for-loop: start -> -0.05; stop -> 0.15; step -> 0.05 ...\n";
    my $loop_cn=0;
    my $tmp_start=-0.05;
    my $tmp_stop=0.15;
    my $tmp_step=0.05;
    for(my $tmp=$tmp_start; $tmp<=$tmp_stop; $tmp+=$tmp_step)
    {
      $loop_cn++;
      print "loop $loop_cn meets condition $tmp <= $tmp_stop with a step of $tmp_step\n";
    }

    print "\n2nd for-loop: start -> -0.5; stop -> 1.5; step -> 0.5 ...\n";
    my $loop_cn=0;
    my $tmp_start=-0.5;
    my $tmp_stop=1.5;
    my $tmp_step=0.5;
    for(my $tmp=$tmp_start; $tmp<=$tmp_stop; $tmp+=$tmp_step)
    {
      $loop_cn++;
      print "loop $loop_cn meets condition $tmp <= $tmp_stop with a step of $tmp_step\n";
    }

    print "\n3rd for-loop: start -> -0.06; stop -> 0.1; step -> 0.02 ...\n";
    my $loop_cn=0;
    my $tmp_start=-0.06;
    my $tmp_stop=0.1;
    my $tmp_step=0.02;
    for(my $tmp=$tmp_start; $tmp<=$tmp_stop; $tmp+=$tmp_step)
    {
      $loop_cn++;
      print "loop $loop_cn meets condition $tmp <= $tmp_stop with a step of $tmp_step\n";
     # print sprintf("%.${10}g\n", $tmp);
     # print "\n";
    }

The execution results are shown as below:

1st for-loop: start -> -0.05; stop -> 0.15; step -> 0.05 ...
loop 1 meets condition -0.05 <= 0.15 with a step of 0.05
loop 2 meets condition 0 <= 0.15 with a step of 0.05
loop 3 meets condition 0.05 <= 0.15 with a step of 0.05
loop 4 meets condition 0.1 <= 0.15 with a step of 0.05

2nd for-loop: start -> -0.5; stop -> 1.5; step -> 0.5 ...
loop 1 meets condition -0.5 <= 1.5 with a step of 0.5
loop 2 meets condition 0 <= 1.5 with a step of 0.5
loop 3 meets condition 0.5 <= 1.5 with a step of 0.5
loop 4 meets condition 1 <= 1.5 with a step of 0.5
loop 5 meets condition 1.5 <= 1.5 with a step of 0.5

3rd for-loop: start -> -0.06; stop -> 0.1; step -> 0.02 ...
loop 1 meets condition -0.06 <= 0.1 with a step of 0.02
loop 2 meets condition -0.04 <= 0.1 with a step of 0.02
loop 3 meets condition -0.02 <= 0.1 with a step of 0.02
loop 4 meets condition 6.93889390390723e-018 <= 0.1 with a step of 0.02
loop 5 meets condition 0.02 <= 0.1 with a step of 0.02
loop 6 meets condition 0.04 <= 0.1 with a step of 0.02
loop 7 meets condition 0.06 <= 0.1 with a step of 0.02
loop 8 meets condition 0.08 <= 0.1 with a step of 0.02

It is very clear that the 1st and the 3rd loop is not working as expected while the 2nd loop works fine. Judged by the output of the 3rd for-loop “loop 4....” where the expected “0” is represented by a small number at the order of 1E-18, we know that the problem is caused by the inexact representation of the floating numbers due to limited machine precision. Thus, the attempt of using string comparison “le” in place of “<=” will not work either in this case.

Inspired by the solutions from:  http://docstore.mik.ua/orelly/perl4/cook/ch02_04.htm , this issue can be addressed following:
1. Create a sub-routine for numerical comparison named as less_eq
sub less_eq
{
    my ($A, $B, $dp) = @_;
    return sprintf("%.${dp}g", $A) <= sprintf("%.${dp}g", $B);
}
2. Replace the line $tmp<=$tmp_stop in the original code with less_eq($tmp,$tmp_stop,2)

The revised codes will give you the expected results for all cases as shown below:
 
1st for-loop: start -> -0.05; stop -> 0.15; step -> 0.05 ...
loop 1 meets condition -0.05 <= 0.15 with a step of 0.05
loop 2 meets condition 0 <= 0.15 with a step of 0.05
loop 3 meets condition 0.05 <= 0.15 with a step of 0.05
loop 4 meets condition 0.1 <= 0.15 with a step of 0.05
loop 5 meets condition 0.15 <= 0.15 with a step of 0.05
2nd for-loop: start -> -0.5; stop -> 1.5; step -> 0.5 ...
loop 1 meets condition -0.5 <= 1.5 with a step of 0.5
loop 2 meets condition 0 <= 1.5 with a step of 0.5
loop 3 meets condition 0.5 <= 1.5 with a step of 0.5
loop 4 meets condition 1 <= 1.5 with a step of 0.5
loop 5 meets condition 1.5 <= 1.5 with a step of 0.5
3rd for-loop: start -> -0.06; stop -> 0.1; step -> 0.02 ...
loop 1 meets condition -0.06 <= 0.1 with a step of 0.02
loop 2 meets condition -0.04 <= 0.1 with a step of 0.02
loop 3 meets condition -0.02 <= 0.1 with a step of 0.02
loop 4 meets condition 6.93889390390723e-018 <= 0.1 with a step of 0.02
loop 5 meets condition 0.02 <= 0.1 with a step of 0.02
loop 6 meets condition 0.04 <= 0.1 with a step of 0.02
loop 7 meets condition 0.06 <= 0.1 with a step of 0.02
loop 8 meets condition 0.08 <= 0.1 with a step of 0.02
loop 9 meets condition 0.1 <= 0.1 with a step of 0.02