From 43ace14dc20f8448dca0a9763b129a090dc9640b Mon Sep 17 00:00:00 2001 From: Marcus Mellor Date: Tue, 13 Aug 2024 17:32:23 -0500 Subject: [PATCH] Finish up 1st public draft of CharLib pt1 --- content/blog/papers/charlib/_index.md | 35 +++++ .../charlib/{index.md => background.md} | 138 +++++++----------- content/blog/papers/charlib/fanout.png | Bin 0 -> 17438 bytes .../blog/papers/charlib/fanout_modeling.png | Bin 0 -> 28507 bytes content/blog/papers/charlib/operation.md | 106 ++++++++++++++ .../papers/charlib/test_arc_flowchart.svg | 3 + 6 files changed, 196 insertions(+), 86 deletions(-) create mode 100644 content/blog/papers/charlib/_index.md rename content/blog/papers/charlib/{index.md => background.md} (70%) create mode 100644 content/blog/papers/charlib/fanout.png create mode 100644 content/blog/papers/charlib/fanout_modeling.png create mode 100644 content/blog/papers/charlib/operation.md create mode 100644 content/blog/papers/charlib/test_arc_flowchart.svg diff --git a/content/blog/papers/charlib/_index.md b/content/blog/papers/charlib/_index.md new file mode 100644 index 0000000..bbdcd67 --- /dev/null +++ b/content/blog/papers/charlib/_index.md @@ -0,0 +1,35 @@ +--- +title: 'Laymanized | "CharLib: An Open Source Standard Cell Library Characterizer"' +date: 2024-08-07T14:16:52-05:00 +categories: + - laymanized + - paper review +tags: + - open source + - standard cell + - characterization + - tools + - FOSS + - EDA +--- + +In this first entry in the [Laymanized]({{< ref "/categories/laymanized" >}}) series, we'll take a +look at my first publication and dive into the topic of standard cell characterization. + + + +This entry is broken up into three parts. +- In the [first part](/background), we'll go over background information you'll need in order to +understand the paper. +- In the next part (coming soon), we'll look at how CharLib works under the hood. +- In the third and final part (coming a little less soon), we'll compare CharLib to other standard +cell characterization tools, and discuss future goals for the project. + +CharLib is an open source project and can be found [here on GitHub](https://github.com/stineje/charlib). +I wrote it over the course of about a year, building on ideas from several existing works and with +lots of input from my advisor, Dr. James Stine. + +You can find the paper in the proceedings of the 2024 IEEE Midwest Symposium on Circuits and Systems. + +> At the time of writing, the publication is not yet publicly available. I'll update this soon with +a link. diff --git a/content/blog/papers/charlib/index.md b/content/blog/papers/charlib/background.md similarity index 70% rename from content/blog/papers/charlib/index.md rename to content/blog/papers/charlib/background.md index 8513e23..c7a5580 100644 --- a/content/blog/papers/charlib/index.md +++ b/content/blog/papers/charlib/background.md @@ -1,7 +1,6 @@ --- -title: 'Laymanized | "CharLib: An Open Source Standard Cell Library Characterizer"' +title: 'Laymanized | CharLib Part 1: Background' date: 2024-08-07T14:16:52-05:00 -draft: true categories: - laymanized - paper review @@ -15,9 +14,8 @@ tags: math: true --- -In this first entry in the [Laymanized]({{< ref "/categories/laymanized" >}}) series, we'll take a -look at my first publication and dive into the topic of standard cell characterization. - +Before we dig into the details of this paper, let' cover some important information you'll need to +understand. @@ -39,16 +37,17 @@ Ok, disclaimer over. Let's get into this. I'm going to assume that you, as an intellectual, have some knowledge going into this. Probably a big part of why you clicked on this article, right? -- You should have at least a basic understanding of Boolean logic -- You should be able to identify the components of a circuit diagram (including logic gates) and -know how they work on a basic level - You should know how to read a line graph -- You should be aware of hardware descriptons languages such as verilog or VHDL (but don't worry, -we won't be working with any code here) +- You should have at least a basic understanding of [Boolean algebra](https://en.wikipedia.org/wiki/Boolean_algebra) +- You should be able to identify the components of a [circuit diagram](https://en.wikipedia.org/wiki/Circuit_diagram) +(including [logic gates](https://en.wikipedia.org/wiki/Logic_gate)) and know how they work on a +basic level +- You should be aware of [hardware descriptons languages (aka HDL)](https://en.wikipedia.org/wiki/Hardware_description_language) +such as verilog or VHDL (but don't worry, we won't be working with any code here) Now that that's out of the way... -## Let's Start with a bit of Background +## Let's start with a bit of background Even if you've studied electronics at a university level, odds are pretty good that this is your first time hearing the term "standard cell", let alone paired with "library" and "characterizer". @@ -78,7 +77,7 @@ place them in rows (like bricks) to get a clean, organized design. A master engi stonemason) could likely do a better job without those rows, but it would probably take them so long that it isn't worth the cost and effort. -![brick vs cell meme](brick_vs_cell.png "I don't see a difference here. | cell image from vlsitechnology.org") +![brick vs cell meme](../brick_vs_cell.png "I don't see a difference here. | cell image from vlsitechnology.org") If that analogy didn't make sense to you, maybe this way of thinking about it will. Think of standard cells like Lego bricks: they all have the same height, and they connect in predictable @@ -103,13 +102,14 @@ a standard cell library like a toolbox full of devices for working with digital Seems pretty straightforward, right? But consider how powerful this idea is! With a standard cell library, I can take *any digital logic design* and turn it into a real physical design. We even -have automated tools to do this. You hand the tool a standard cell library and some HDL, and the -tool "synthesizes" your design using the cells in the standard cell library. +have automated software tools to do this. You hand the tool a standard cell library and some HDL, +and the tool "[synthesizes](https://en.wikipedia.org/wiki/Logic_synthesis)" your design using the +cells in the standard cell library. > If you're working with a standard cell library, you've probably come across the term "process -design kit" (or PDK for short). A PDK is a larger set of documents, tools, and design -data relavant to a particular semiconductor manufacturing process. For an example, check out -[this open source PDK based on SkyWater's 130nm process](https://github.com/google/skywater-pdk). +design kit" (or PDK for short). A [PDK](https://en.wikipedia.org/wiki/Process_design_kit) is a +larger set of documents, tools, and design data relavant to a particular semiconductor manufacturing +process. For an example, check out [this open source PDK based on SkyWater's 130nm process](https://github.com/google/skywater-pdk). > > Don't get confused: a standard cell library is not the same thing as a PDK. Usually a PDK will contain a standard cell library, but it's just a small part of a much bigger collection of tools. @@ -131,8 +131,8 @@ just apply to electronics, of course. You can characterize all sorts of things i ways. I can characterize an apple as sweet and crisp. Or I could characterize an Apple as a thin and light laptop with a retina screen and an M3 processor. -Of course, in the context of standard cells, we want very specific information. **Standard cell -characterization is the process of measuring how a cell shapes signals input signals**. +But in the context of standard cells, we want very specific information. **Standard cell +characterization is the process of measuring how a cell shapes signals**. Let's pause and unpack that a bit. What do we mean when we talk about shaping input signals? @@ -147,7 +147,7 @@ you the exact same value you put into it. Now let's say I connect the input of a buffer to a signal generator, connect the output to a small capacitor, and feed in a signal that slews from 0 to 1 over a very short amount of time, like this: -![buffer input signal plot](buf_input_rise.png "Let's see how that buffer handles this! (cue maniacal laughter)") +![buffer input signal plot](../buf_input_rise.png "Let's see how that buffer handles this! (cue maniacal laughter)") We can expect the output to look exactly the same, right? Well, almost. Reality is a bit more complicated than that. Take a look at the simulation results below. @@ -155,7 +155,7 @@ complicated than that. Take a look at the simulation results below. > For completeness: these plots are generated using CharLib with the standard cells in the open source [gf180mcu_osu_sc PDK](https://github.com/stineje/globalfoundries-pdk-libs-gf180mcu_osu_sc). -![buffer input and output signal plots](buf_io_rise.png "Look at all that delay. Reality is a bummer sometimes.") +![buffer input and output signal plots](../buf_io_rise.png "Look at all that delay. Reality is a bummer sometimes.") As it turns out, the buffer introduces a little bit of delay to the signal; it takes time for the change in the input signal to "propagate" through to the output signal. This is called the @@ -164,15 +164,15 @@ change in the input signal to "propagate" through to the output signal. This is It also takes a little longer for the output signal to transition from 0 to 1 than the input signal does. This is called the "transient delay", or \\(t_{trans}\\). -![buffer circuit configuration and timings](buf_timings_abstract.png) +![buffer circuit configuration and timings](../buf_timings_abstract.png) Both of these values change depending on the structure of the standard cell we're testing, the amount of capacitance we connect to the output (\\(c_{load}\\)), and the amount of time we give the input signal to slew (\\(t_{slew}\\)), among many other factors. -For combinational cells (logic gates, buffers, inverters... pretty much anything that doesn't -require a clock input for sequencing), these two delay characteristics provide a pretty good model -of how the cell will respond to input. +For [combinational](https://en.wikipedia.org/wiki/Combinational_logic) cells (logic gates, buffers, +inverters... pretty much anything that doesn't require a clock input for sequencing), these two +delay characteristics provide a pretty good model of how the cell will respond to input. But what if we feed in an input signal that transitions faster or slower? Or what if we put a larger capacitor on the output, so that the cell has to do more work in order to charge it to a @@ -181,7 +181,8 @@ logical 1? ### Changing conditions If we want to have a good model of how our buffer shapes signals, we need to take measurements -under a bunch of different conditions. Those conditions include (at minimum): +under a bunch of different conditions. So we change the test configuration by adjusting the +parameters listed below (at minimum): - \\(t_{slew}\\), the amount of time the input signal takes to "slew" or transition from 0 to 1. This is also known as the slew rate. It's usually measured in nanoseconds or picoseconds. @@ -194,7 +195,7 @@ This is where things start to get complicated. We want to see how varying both o results in a 3-dimensional *surface* of data for each delay value we want to measure. Our test conditions are shown along the x and y axes, and the delay is plotted on the z-axis. -![buffer timing simulation results with varying fanout and slew rate](buf_timings_rise_surface.png "This chart shows how both types of delay are affected by varying our test conditions. Pretty neat, huh?") +![buffer timing simulation results with varying fanout and slew rate](../buf_timings_rise_surface.png "This chart shows how both types of delay are affected by varying our test conditions. Pretty neat, huh?") ### This isn't as easy as it sounds @@ -211,8 +212,8 @@ signals in different ways. 1 (otherwise it would "mask" the signal, and we would never see it propagate through to the output). We call this the "nonmasking condition" for input B. -This is still just a simple gate, of course. Sequential devices, such as latches and flip-flops, -add a boatload of extra problems: +This is still just a simple gate, of course. [Sequential devices](https://en.wikipedia.org/wiki/Sequential_logic), +such as latches and flip-flops, add a boatload of extra problems: - We now have to stimulate the cell with a clock signal that has an appropriate period and slew rate, in addition to stimulating the inputs. @@ -244,12 +245,12 @@ process. It all comes down to the need for faster logic. If you've ever looked into how a computer works, you know that a processor runs at a certain clock speed. Each time the clock ticks, the processor executes one instruction; that is, it completes one small task, such as adding two numbers or storing something for later use. The speed of a processor -is limited by the amount of time it takes to complete one instruction; if the clock ticks before -execution is done, data can be lost. This limiting factor is usually the slowest physical path -through the processor's execution unit, and is called the **critical path**. +(or any logic design) is limited by the amount of time it takes to complete one instruction; if the +clock ticks before execution is done, data can be lost. This limiting factor is usually the slowest +physical path through the processor's execution unit, and is called the **critical path**. > This is a HUGE oversimplification of how a processor works. If you're interested in learing more, -I recommend David Harris and Sarah Harris's textbook [Digital Design and Computer Architecture](TODO). +I recommend David Harris and Sarah Harris's textbook [Digital Design and Computer Architecture](https://shop.elsevier.com/books/digital-design-and-computer-architecture-risc-v-edition/harris/978-0-12-820064-3). I've linked the RISC-V Edition, but there are other editions out there for other architectures like ARM and MIPS. @@ -261,7 +262,7 @@ characterized standard cells, we can quickly and easily identify the critical pa because we know how much delay each cell introduces, and how much each cell stretches out an input signal. We can start with the specifications of our input signals, step through each level of logic in our design, and end up with a pretty good estimate of how much time it takes that signal to -propagate to the output. This is called **static timing analysis** or STA. +propagate to the output. This is called [**static timing analysis** or STA](https://en.wikipedia.org/wiki/Static_timing_analysis). The big advantage of STA is that it takes a miniscule fraction of the time that it takes to run transistor-level simulation. This means that we can iterate on designs much faster, and only run @@ -273,7 +274,7 @@ a ton of compute cycles, making characterization very worthwhile. Suppose you have a small design like the one pictured below. Nothing too complicated. You just want to know whether it will meet your timing requirements. -> TODO: add picture of a design that has some fanout to it +![picture of a design with some fanout](../fanout.png "Yeah, this design doesn't do anything helpful.") See how we have the output of one gate driving the inputs to several other gates? Each of those gates has a very small amount of **input capacitance**. They don't have much on their own, but @@ -283,60 +284,25 @@ where we're headed. Recall how we took our characterization measurements: we fed in a signal with a known slew rate, then measured the delay associated with charging a load capacitor. Now we're going to use those -measurements to estimate delay. We zoom in on a single cell, add up the input capacitance of all -the pins it drives on other cells, then look up how much propagation delay and transient delay the -cell adds to the input signal. The transient delay becomes the slew rate for the next level of -logic gates, and we can keep track of the propagation delay by adding it up as we step through our -design one layer at a time. By the time we get to the output, we know exactly how long our critical -path is. Hooray for knowledge! - -> TODO: add picture showing how delays add up at each level of logic in the design - -We've covered a *lot* of information here. If you're still with me, please give your brain a minute -to digest all of that. - -Now that we understand standard cell characterization, we can dig into this paper. As it turns out, -understanding the background is the hard part here. The paper is pretty straightforward after that. - -## CharLib: An Open Source Standard Cell Library Characterizer - -This paper, published in the proceedings of the 2024 Midwest Symposium on Circiuts and Systems, -describes a new standard cell characterizer written in the Python programming language. It's open -source and designed to be simple to use. - -The innovation here isn't in the details of the characterization process. That's mostly the same as -what other open source characterizers have been doing for years. Instead, CharLib introduces a new -way of handling standard cell information with the goal of making characterization easier and more -consistent. - -### A shift in perspective - -> TODO: Talk about how existing tools typically work. - -Existing characterizers follow a typical paradigm. You more or less tell the tool where each -individual cell is, then load the tool with information about that cell, then tell it to run a -specific procedure. This is a pretty manual process, with the tool only handling the actual -simulation automatically. +measurements to estimate delay. -For example TODO +![fanout modeled as capacitance](../fanout_modeling.png "The best part is we get to ignore 90% of the circuit.") -CharLib, instead, tries to automate the entire process. Cell information is treated like metadata, -which can be stored with cell netlists or in a centralized configuration file for the whole cell -library. Instead of configuring the tool every time you run characterization, you describe your -cell library once, then you can use that configuration any time you want to run characterization. -It's a shift from prescriptive programming to descriptive. +First we zoom in on a single cell. Since we know the input capacitace of the cells it's driving, +and all those cells are wired in parallel, we can add up those capacitances and model them as a +single larger capacitor. Presumably our signal generator will also have some slew rate limit, so we +can use that spec as our input slew rate. Since we now know \\(c_{load}\\) and \\(t_{slew}\\), we +can look up the delays from the characterization data for this cell. We keep a tally of the total +propagation delay, and use the transient delay as the input for the next logic layer. -One of the big advantages of this is that you can store cell information relavant to -characterization alongside your cells. This makes everything simple and bite-sized: you don't have -to have one massive script that handles all the cells in the library. (Maybe someday you'll even be -able to store characterization metadata in the cell netlist, using a special comment format or -something. That could be pretty cool.) +We repeat this process for each layer of logic in our design, keeping track of delays and how they +affect the signal feeding into the next layer. By the time we get to the output, we know exactly how +long our critical path is. Hooray for STA! -CharLib also tries to minimize the amount of work you have to do by letting you set library-wide -defaults that cascade down to all cells. There is some information that's different for every cell, -of course. Those items are required to be documented on each cell. But everything else - even test -conditions like slew rates and capacitive loads - can be easily set once for the whole library. You -can still override library defaults by specifying settings on a per-cell basis, of course. +## Conclusion -### Nuts and Bolts +We've covered a *lot* of information here. If you're still with me, give your brain a minute to +digest all of that. +Take some time to review what you need. When you feel prepared, move on to part 2. There we'll go +into detail on the charization process (coming soon!). diff --git a/content/blog/papers/charlib/fanout.png b/content/blog/papers/charlib/fanout.png new file mode 100644 index 0000000000000000000000000000000000000000..1913753d03927c98d71409d697d7bbc2bd7521dd GIT binary patch literal 17438 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 literal 0 HcmV?d00001 diff --git a/content/blog/papers/charlib/fanout_modeling.png b/content/blog/papers/charlib/fanout_modeling.png new file mode 100644 index 0000000000000000000000000000000000000000..84ad826aee28c15930569bd5e4596008c3dcba2e GIT binary patch literal 28507 zcma%jby(D0*Df;*GITR2A{|OfHv`fkV1aa~AW};AP*MsA(lvw#A_&rrAfV&`qI9=( zNptq#`@G+CzVpwyuK5RM=C}7=d*!|EHDNlpRY(Z05aQtAkf^CD-oe3vVsLOERq#vT zKelujQ5+m595qGxd+sJ{X#|NhgIoI=I%?2R4!V{|$fHL(k6gxv!oprL<*~u@4mTmf z;V^3I)@iZ;sZDYUB?0*7?9fn_-#CQXNVadJ;kLMxBE&F(j_q+t$ylkDuCet|mm2L1 zUnw%OuM$4D2S2U2Hs1ZivzQuY9HhYtY4f_>cglHCqTGTJfunH#c_ArbJ^rZM0axrH z5OSPXmfXLd1StU9F=Q}F zNp%tu`p(ffP4v&&sHZR{v{r=bw>AGR5)T}6*?-`NxI)PNHyN!k;1k zEO)W45jhIw3L(;x|GSGOUWm{>vEwt55g>AE6&&c5L&(K`!Im#xd~hVP7Dbbmt4~Om zrr&b+zx%9&eZ|{7Kb<`9oB9$M$8h4Nto-sw>`Y3WiSgvnNcwOtc6Z1!YTC)FZ>N1N zkYVlbg1eL$7POO6smVZ})c>{D18t-cGQ+7y!g+yM8`6Y#vHVmpj-OLVKoBCJ3V}Vv zF4+9f7Ml71a6FV1RF_-Ttdg+zdLSuy&zpsb53PH1>-r12HcqI%&N7uX@m;uo9)UI6 zg;auqQB^3?h}mK)?2|M(Q2{~A6ahZql)CIV5Qf2TEe`)Z8##`D4m^~|`krP?IIcbP zAN2(411EqyhrE{XvS*1pEXR9lPVpw?MBZ?e0L^6X6*SEVbV(mvUWmvG-(iy18;GZ` zaG_QdNO`E*g;bwVk|QvAiHVo3^}zwjWx=IQM_lH)1R)Q-1fI)4V!KIsaZW0vyn>wN ztBV`>4i0_$<(2jSWhh`9;cAbZ2>!7ZtRAyrH{CTHp*Yc`1`fjrM>9?1J|ezYTMhdd z=zr`@4*L%N<5v(U2Sw9QJr1R8al@~8!Z$d~31n7b5ORSupsoKE4-jlNA*C)a|`PljB^&m!aB zUXC73f{#0Nf(dEzELy`o{1SK#Mac~X@`Rw@5LT%eLSQ`jkduy&fj5rIqQGUfrPi0m z2KnWG>*~r`=uSCKmsg3rnu&`~s^jWfany3or<(;EEYOSU9~j8D8?AVooV-$NOjm3T z9`{Iv59~9V2&=^yMJGL@f8IFutSZH3;HOC@lFU46##c2->Z5gIhn7{pkpUA)5rDGtd!1 zS(f!gzR;Ppt8%{5GJ8Mn{>V|Ix+3n#Wc<99hJ_dt<^&F~_|euOEFfr&g0#R-KOXV( z+ZTHYpe-+WB37?!25|ifvr6|+CRi>quI=BPZW$CNGdd$jHXO8E&i;>&MSceM2`}%(luLQ}$PbrOE2Je4gxV-Kpk92F`F>OfgNtMW^EpIy?4Gs$y zRcdf&4?X^CvCRs=FjJ(h`177d*WkTbf8;eErr(nh(8s7HK>$?B^-;Oq)CWEh?TgVc^V}h~>Sj`_oG6K9-uD z9;vu!--GFpdgov-DsoI3e+`~+ZHV_9HK$l2O2KPc2&`GcIk9#Z{(U$MZAg9?=V|J_ z6-?PzSM0btRN_lQU;W&9F@h1A9Qe|EE4_vsGjTZ!ANw_oJlOniftcgE#dI(0<{*Ny z=d*3z_es4d;;W((QwR3O=%M&Hw=R)p!jb6$4# z;CNoc+|I8o$Ai3~C$39Jzdya-UmMM)EF`E~_ukS#F3!j|uw`&@sj~Hwx?Q-Y+t5sM z%%tDB%;|zyW2U6bicV)d@6&J5%pRKh$Wr}h}%G^}`pv6_8%qoJBl>qc<(v%x;&trCRNorJ$4>tW_zU2`)S%ITw&eVYY>!!-RBs z+!g-ZDmh`TNotjsoj>*_B<`)Z}r&jI5S zkA_D$&`G4*N}?(l`U_8tECw1=7AfInT;r@8_c*;xH&X%6pvsYX@RO4((NA2zaFcoBHvt3Q-ymG zeb7vhS-jn?+4g*!!4GAY?W8qJSrJPUUK{rfCRV&%73OlZIzaav>HSIv^Ha zy?)0Y14E9z*yJ_yw_S?UAoC~K5 zEBoHnbuZ+>P*nyuW4dm=r;7nlkEwRw-oM_9n?g{}XRhtnpjNB!&oq8{LhIOVr5h%a z$Ns3FY6u^!Yea4X`8jXrQu|tkkTNX&X*~By=aTg~Dl^bI=#kpcF)%P_xPCS85=oY2 zdt_fI1?xR4Z|Xf@!Pa9{&&e_U{$anP8cFmUePy&#M73tQ!fKzGbMZc*ic+7ktf9cH z3h_s}cx~}JRpaNgImu1NuJQ-v&P5nLkuOW&Q-w|AwgJD51ED9N<3&5Yc=1+$qS}e` z{)cCN%9v%5?9Fs>j_>I&s-L*qXh6f5Z;YKyaw0F(#o* zWVpfRM_#5r);Ndxq$jP2tj2v|5B+;cKA(ASo!`6BOYjOCZ^2997O*aj2bv~+r!FFR zv$5K;-|=?~D<`t>ueqc4*T)NjUaX6{j#Ml_uk`7*S|uX~-1^C7=Y|6sZT?wRTDH0&f3LreYnuv%+Gl13zJ}4rQ5d$-(jDh_ zc8MvpleVYkR6q%d53X@8Z}jFVpK4V(*+qWB^Z{!ErQzR~={6`?x}N>~n6GHKt~(Lz z(s92JVd5^&D@kmTnPM-`2EBuh{rHh*r7s)bZm3uuE%wKFsQFOR^3V?- zR(9TXlLc#9;>;j|rV(E$7X=PfP1-|4YT`DZh{&K@sqOT~QL?)*VNTWP!x^stj+^Mx z07XiMSz4^~!hvXmbWdj5$+gs8ey)qq&tR)rOZFhw@BHkHm`*I5H`V3XJO)K7XzH!4 zL;N?*G$Z+spRCR_Bu{$#dZY2YAsM&cqLpy6`*U!qy__Z`Mt&h;gCHC-P7$55yl8J! zwy%uye5Z}fE#&3jpleNJJyDy&jX9~DOt7C`PLQiP#jvAeJsd72@n6-Jy}XqfaxLr6 zgjW=Z8MpRU2D3A7g?yM@KAbW3y`fi>TG=*J{>voWyyaznp%A0@ru@pUPZ=W~FV79t z)d_hGD>Q|*bfU>y!+NkvgnR`O4Z4mjseay2Z^ti#t6N&NQCZT?l8Q|4l0k zBR}K0gPbLe+ykA%W>IJ0hmyAEVzuwY-MGILNG6M3AFmzwaKGTk$?AcfV5Qxtve=j- zuFr0t%Do!rr{%`8Z?E578hQ3M@hNw>d6-r%^^#nkxA`$}TT0o=ud^!bMi-Kfzfx&qJ^CO&-4-;ta$M@g z9Q^e)8H4iq4?F2HUQ2O$CjKbbE2{z(8Vdz+0!IWXU@0RCkoy%WN2$){5wOr+3&baT z0R7qvl(FJqT6kZ6o@lf^g3jZbsCH}B;X=xN8p*S81jeXv;e*pBllptH5>5+TTXkk% zpmxwJcm(es2DxH$n<;(>+?vr{MT;Ek?cS!R-#)3#NZ?IvnF@KN%a`XpJvNumBTZtt z@*}_O#k~55d-;?y+uvB7e;K<`XlH~XFk<7*R4&W?N~hD$wq{y|&6;owD(%xmA#00^ z_?G^_s{!r(M@GJMus1tz)y859JnF{)Q2lGyZ>$I~D6 z1mXkol$yC14d*%AH$IB@LCL<*8ZA*|rC=tbnI zf9P#jI99Zhy=N>$ZwIf{E+jw8vmdXq`7L=C>;P{0M~S7%6~RYv7vR7$P!n|?Lgh~f zl(mMr?th>*_SqX0_C0aGANTXVzp{MuQ`$@htjrEHfM?9M2q1LUiDe{;opX2@*c8w)W<}Dkto#XXdZC<`PZeK$D^Ybt&&JP_s`FG#nqfcM|f`F9` zSZ7~6aR{5qjQT76jL0L%LRYYt2AA^sil0*B#qr-><>o?1)TktY^EIoz#azPr<`YhA zwY-DW4@bT>Q`1ma8 z@5$6q7mLeR%FDAX!Ogs}4slZr$dq!8&>1+Lr)MXJ*o^96$hGaKp{7PKms6Yv&-&}cUE=b=B@bskdC9#pJ;@}Mzen3xx;{NpFUn61Cq5hlWgds51 zw>PhjHlCku`~cq18=7qT4O=1gWvdkA8o5lAT9MUncW{$qWW6tmKQLNbG&KsSy10*j zJu^D7DM>%piBjwq5fIpKtOYJhcmcOokYeQD0Ce+ddnAMN7d*rq6=uA~KQC5_p>jXyw8?0~vQ7yYiUQ!s7Tc>GW!tCC$gYYbYxqw(PSRq66~5~jxGHxpXK?;1!<WRGx>KDKx<1^Y|{sgFsGqu*om3UiN1C2M?Cvy(zgCG}%ORqa zKME+pno$!6G?NMg>LI*w&)$7L0KYB12^p88NW zN?7(N`dx5Zj-AP|MH}#n4!-jh9G>cF9GV=@|9K))3~SXm{#@A5=-WFSk%4P$G{uB| zJmA@vrR3bnTbUg()qz5H z(4HRT{v;i*SlZ(ju0DkDIyVF@A6ghe5f;&tcwqtp{;#nIGJ{?OCnnxiZ-K*)%9#*o7Xv0#onE3Uq)cOWNZtO1b`{;?{NVFOH~b9jkMReUz+!NrPVkS#)CSQ!H}Icjm?w5-;3O&#d5 zm_^2-A|ok$Nik^mRQlCnR@6(QUib8l5=HG+s-{QKM{sx*>qWvvP>EWIrGF?c_Ow6f z66saCgRL?9{>#u265gbW>2C>}>bO9v(n|c;#hA3PRR+EFEx-Qe+sSGV9?;eUwde?GzhtFUY{dz3wfSMP_dw)zavfTIy)6DphzGJDtdRU zGts>%A$7HjO-LvNyjOi$5vJaawi*hX4M-*0PnKan!0M!(QjgR#2c&6}(xS_`p@rV(}+hflXF#@Ky^#NZ&{r3zIQp z#caj_lul?CS`Y(p_B2=-i^G=};%doDMA&Qs*~E9DT2!@^Y?>1Q;Jj{7Omp!D4y+lQ z>sa=fxW_WD#@|AQ$OOC`VVufs<5HzdrV;>OXW9m<`KkNkOul)et#BQO9CL@QFX}o> zCt84=viJfZ*rvJwMwwazSO6AF?eVH00@MY3pO-FR-#V;+nCSX4&J-;T8U%C0)3=4N zi0cz0vkQ3w&>jCHz#{FmxTfJ30>**UVYMdP!os<(P?QuZiQ2TNti?fFs{ZvjXo3r% zlt?nCkAV>?SyNIu=tRwC`2A`TimhowDGNG7cWWC<~zj9nRH5;p`?^4c48dF~ohsC9Su_srL;&o)h6Q`WXn3@M zGG4h3y?`sQ#)}V;fSeB4c;C}Jfz!8ffqF=I8~Pv7BAdvdFQ7-9&u&`vMirYA!>#9# z)Bw7r200gh9E5``kQ{9)#l3Dfacw)p?psj)cY*+&4=>7PcQ_k8=NbKd5Mk3WYi zi)fX>f002$xp58PC+5^gIR1}-nsMGD`ID%LgBO;CS2h=cnY)Uz1F9kj1J0KmBlujN z{}KR|MVa6N5YU}rI%V1Yasf7z3qY0^Ut;x;ZHhQ-bCVoHK`Lt$MGaX-nCDD=c}O10 z1$pXogAcuB7GeG5%9JRq3?h#r$b#iC9%QxQ4PCB+!5MD>Ooa=`tUAo`5el>efHdk;W*d<2RM1z~bSGqR40&Jx)g69Y{xk9h} z6=*gs`N1<%V8~7u5RFH0Rk_W_9|;=}js&uoih-pnBWsu-5QYk3RJ{^V9px7&q%ihi z+43YN0mw1}>OW(uPd;RTn|sVOLU1ML4**d6+lQE@82z~jmL8d`o+&|D{gLkQi?cDj z!#8yA=eQEDfK*}a(cQjtPE&#kz@M8#p=L$Fe*rcjBp}rpQ4cL#c|X1tWS-H z2DK%N8E&$1e0N`}C-5;G-+kHf^^9S!lNKTaVu1nHi%!o;|1Td(bcsF2cWShm+Q>GH z?F0vM4p&96F`;>mapH(Uo3Q8X3vS5yPA1={3l;dLL$VEav*MSa=s%@qi833>~SpW$sA~3C`b2x z|DJij-~okR+oaDQ`eqPNjc(R+hTA9ay za!vI(um6+fu-W#Vue+e~TFx>xQFP(cerGdyO119`1>jkT>w^dJl>Iz;{0#>do&ZkC zSBjuLBfeIm3kLLi4^s)IFiqe;%=ch@9J^L+!A?-d%jSbnx_-?uA!+{q#7 zu}y7k!WqZcSQmM-LX8dz;g#<*W}I!0djCG%GaNJ{6hKQShr6h%*%;s2mn1ID$ z0}`;Gj;1JofMnv^jn_!*i@15svNSqOnv8t*pz?89;=cdJ9#j10xhRJvIm}t`$D?(R zg(R!D(d#4S+$4;$Mp`>f^Vm+7+e_VLNJLaN<1z-%w)&vzzJ^(HMUg>Rknt=PXe-M=d9o%pYO zDXa*jsaBUV@4vx1u?qC1gi_Y9*7k}=Vka1-3#%*SzEk4swmNisw9?@MdTvgAu}LW#^OLHTdS0Ms;t_nbzor3- zrQApcDUJpRFS3ap+;C>+^lMwb)03T*9NvhiG+Oey?dH=Xf`8QOFxISXH~&Y?-o}#N z9P84jf4BhioxgiY$yifmeUfDl-OCMdhS@l>o(q(i*lKPLot-_nWq6ZC|cm32`bI)f=?+ zDR1Dwpu9oXEYxZ@i&1$S5AI#SgQ=aY*sp zx>B9(upq^?2k<2Y)dOC1HDxz`(W}csmz=VUpK!p+G|VXMuYqREbo0zCoU^dENCO*h z3Ip5I$4%RAd^^_}Ei5$IV|F>3We6s;rX6vbNY;9PJ1u9!@8Am^q<$ebDz5%@icukM z)K6Kt5SiTp`xeOj&N(M{HX|(ELAD{dXQ&2l@BPyu$`))af#GmwQ}H3Yw1Ro za;ILnx;NiIJIQ>RvCNix@qmugI2s;|GO2LB3EEyXd9EGv!t<|xE$61#_ZYs_D~5LK z_JrBJ7uguEZi6rRo&F|&+?K02Hj(ed6&sD9qI#O1B(^dM=;q@M{frr-K6qw+| zW`5No1wYUq9O4{#n1}fQhxYR;&?7^Pk#|=U)|Dbk4u)PD2@m35WE}BD#G7wl<=^ET zV6?oyc;}sZt4Ra*(#cLw)Ef2H?8$-v+`7VP|KsH!We=T>_CE376sZg^e|CQ6v->6B z57+6!e%ld%&3MWKC^5FQqo8^_-z-^bG?PBJ4S$Cob@Dgn)NV8wey#ZYSiQhE@@!GR zK_5tP*sGhyc5mDocjCO%cW_2i&GDpb$qB|F^e5NHtw(jPkOU>3FKb<%oW16Kg zyhnHBC1PT4P5K`5j(Zw%=JVk$FJ}CfdpBMpvCNaD@s^7slthVS&WHZJ+#A0>nQ9N@YB@b~og2|Wu(9A{f?Gg4)d%d+QO z3&VNmqTSK7EC{*_XCVimM0gcVAP#OplmwqJ)k#9(1ROMZF|r zEb_g%I$rCxNb+a=nZRFatw?>HJj?3|U5x+&_sh_Hw^Rn_MExH5;dMSJB5te47+4rprFDkVh z99p3tS|bqs{JvWe`h)YH-=n=&h(P>kU;=GTgKsk)3tdTNj?)TO$|_}XySS6IuOzEB z#q^CHE^neQXj$De6RU~CE5iJkk+eDiI?+dX} ztbNO;3VMraU#p6*Ukx5d%*kS^_cxv2f*yL`yT-!luOiu_n=?IPlc{P?pZ>a2ZZr70 zm$z=3<0kK*)z+W1H9ltp}LgoYAC}G7m9JOjrtFmF9WX$371mr zYr^zxcNiOJ`Asx&FA;|pl0C$StZ{_$jaY1z5b0YRu>Gwre(GN4;$v)PL!WO&l{??4 zfD67lmPgPAV$;Paxt?&l-ani(Ux|+bP_DEP&|~wX@dXIJ=Su$j)XR|%m^P_E>}2+% zf6>n1#tOK_7T(2!sUyi?`&}>BHSNNZ`id(?xe$}MF05-{wY!$MRV)HCTXon~XQ_sS8!+ZX}}YLnlvmrVf#+@x;5WkEzAYq?^|< zaOmX#)Hz8T=`c|z;hJ}kUgU9LrQZB9p7i^Sf_{5$OibOo48NEPwY}ihc5LMjyTGq6 zM?3cC$Z}{O)k?mJ{`0wFex%wdHDkTf|gO83+yuTW#$!*$wSrkh+FcuHDghLADT8alYO$aX*fPO$936zHbPx^SX#edIy@=Z8`zUkHve!(+pQjWe zpZXbOZyI0O^1wEq>&&&t6evmwDUb{$4q)OsZwth$tn2EUG8~Mae*&y^cHLIxUYQOf(ZrP1@HA zGp)}-0$>qWtC0`VmWEO8Q>Z^`pEHQ(9zNN%kFbJC1V7HK#}EjS*(nYU5ASErerj&0 znXIr&`8*g!C=AGPR*LTJvA$p?1ASgMkzVS&I``{}X}Q-Rb48jlGN?5fz*H(ko{#9~AAO;he?3r|)-9|D3<$ z(CYuFB(jlKnLiecxU<~9jX*rjJ}Fa#zdRps$agIm6bx_d0Vpy__noiZQsA@(Mr zM&Rn|>2AajKLjM<`yv`yyDVKa80k+3F&canv#W~8jfwh{qPlJMqlFZQr7@@8Zu%7M z1m!ZaSW>l4CZ?M*M^s>Zr{$EB;B!h*9dUnR`P~ZQ%!wZ0)o6SfAfQjHfS8&JV z$%q9QdGlPAbY7(Tr-J5|r78~9ndDSD!h=Ez`5$b_;8%x6yA3RjR`T;c{2WBeAepnD z)3DKS{A2lrw>e>moWztXHQ4UxmX4{LE%H4GO+){s^GXP5Mhd51e4YjTNHN8WG z1GmS7K0S0yG*Tlx!Xcq%JNYh8ulxq6RS(-YhaycY+~boA1oASMtfRQ9lBtCT_8WVx zHyW&B7X=lN$FaC{tx_O9X1GP{?wfVYSk{|lxqX7U6Zww~>h~YrGeUZ~{MRI3c^(1G^_o!y5f#=pu!xpdp*$!|Jwl#zZs#M>Q@NA)ed#x;q2JZ_mAMC&v4F~0stkP-$ zD^|9%@Wc@)lCew(#*`lA5m`f7hl|sVLJcG#)s0w& zRchrE-Cy=@zn5gAWgE}Wyplznu9RE%CEsYf{hVkUY;1~6;k56gNxdY9av1=qxd<_! zdS_PD$@@MPKv?!YBFgSCb^Zuqtmm%y8i8@BmxyRM-KTf?$j4aQiEsGh(_}Oj*4Vag zKG6FS=2mDhsS1jP=jjO<-Z61*Ba^vW^veUDYp2VjH9XQacoj*hHrGM*UFw}zIt%zfFK5tNX8GQ4nj zh-e(?;Q2*Z-Zt0T&fK)vp(q{VO^E^R>+JSxUS0Pc!=H75rp%op+Jbu}sEJAkeqMJ! zS(hVAs~dmwVfiwwo19l=r0DznfU(XkC!JA9VreyIb~(f z@(s#Y)RM24kna24y3plV;)0e@z&6qbcomDW+qetqMyQFM08`VGq@MHFJ1l-7SuHMJ{p{pmOW0{a6A&gdV;8J(p@&#t z)vk#f7<>`|E#omg16D_UvHkT984Piju3-A?l0q-Co9>;^&rc5eAC_;Hdaj7rkVjZgm{Nm`njK`+&Qc9w zYaq|!I7)m*_21>N2CoswCmtMF&}nq4sa2?Py(BoO2DU5rv(P0q(<)TYl-iF0pojop zO}1}5)ecL(a=NqkTaMj?ILX(^>xOPtkZy%~BT^s9DC7Co=GSetC95Y-o-~WzrU&%p zSGQXm8oIxIbM(~68J;=G>fn6EF(im@7 z&P+^Ny`1QL4mIFCGv?In)@Lw`R-RUo3vr}(zPFNbp%Ifk=+UfZ16=G^5$AHr$?^|!!5!o#LdOKe=xu+pA= zf{*u1_0NBbP$Z+z?wb)v_~NE^k|4Wi+8Q8zdRMOi?xN`!ND~=Hvpn0J@*D+cpawO9 zI>k_*-ER~IWlOk6cB|Y|1w}S!Eu_Z#rPYT*c~46hc7L0ivW%DWpRP?dM#<`Lrc?Ij z9x?HvpHpUf+hD0jKdPQv-Y;y4OT;lT3cIXU1_)i%r}qmD;?6*!&`u~)xJ_V9>!@O} z@&9r{D8Hy;@PVG-R5y`VNQYb`5b>nEL`#0>$D?(2{p#^N`K~@yXD^>PuU9X=R6w5p zHVxr&8m4rCn$vyim77%4NZ`p5Es^LQ90JdBYFiW%NWq?w{BH1kh9j1 z+dM5Ej=Gss{S}Z34c>5L+$Md*)`m)M&D(h6)d2B*SQ#tOgu+@1E$+?j>ujRnwRL#e# z)ck33QFW;JbXzXEk04U@@m7vyHS9O6d?m?wY1X53c z%<-;Njq`HW*=D)>mcdopB{4NW9Lr+SfIzvIRY>t`p1dge;5 z)ZAaq`D)7fqCGDIxIUYXiAK|~MWD@>9~+vtDViYZuVexzq;P+=3d=!Ixm6hS@Q{G+ zWK_RP2VnAF0LP`b`tJMNy9tdaN@?+z`O%;kZZ{(A;LogwmZ*HFTAPNOcH9;7P1fYw zSe=Ixk8C_DOm>?h`m7EwSnr}W(kS1XD63SM%;)~r%^P*Vwb3j3QP0WkA@Pw1gXAtv zp?ix^Oxwg{E_r|) zxtq1nt2BXd0r^yDN(?V%ZhtF@^W?JX9_4SbsBV}qdQU@01 zV@1YN<>H%*a_1fZZ<5Opf1dS0dMDtPEX^lufhh~OK6Fp2I;e_XF5ix%|B=nx%X|R{ zkc4|o<%02qvJR|#^Ps)54Jmvcc1^X`JkVF=VS7V*ODwUuK>&MvhFP68qp#E zi!FOf+oM6>PA1v1Yt7dw3{YaO!T@828lbEX)4%UOi9p5g<3c5eU%hag#HKhcLqA>v zI)jAunqTa{I~eS#ps6u%`~4#(bXrXRK;+`}iGR(1xQ=21FW0wWV-%HqFsLO}0mA6b z(q)M0`&Ac(I3}1dl7_x=g)KR^rjwj?eLae|&e!QbD3) z(Ou5CE5f#OwIq_4f>1x@2Onm5ON;rv8!vyRcSY7)eBZHY#d5pG!x#w%4Q)K0WvKn{YOd!S-)QXfYq2X*jJ_Lh`WpL_}80g9bvYwt0-8j+rzDj+V)lT!vC4M#LQ3B`WO3rwm%j+C0(tjG>SjD0>V800Bu{;Lg^Gtc1*Qk0kn=glfnX*fv3k|2VU~oy!b+z12 zA?{DJtm~?rGuxtSx^>TY2~9w1j^ri%`0s`L&fL}Vp9 zQUz41WLa%_1x0Oi1gHKpBj`<=BFnW@tpf!mZ{tmX3`~Aai?Raxav?Qc4AZa^7G-g|i~*yyW~ug}`cJs1X#MfH9qvq3Fau8#NJsiR~0ha0j`VeuJZ% zOV{uJnZ8n7MKpV=3zRzE*3#n5qF1d^^d3Jm0)E8xWM&i};ZR!r?T+h63Mf^Vt4v1C zw@UN^jy5iwIt0R->Q!rL*z9xK{j11RCZy;2U^@NIhs}OpOL&PA;YziNo= zd~X)&NxYu&P&+!ul!+XZ-t3=(hwY`~X$oc$(O0{l3f?+828V z&yRmI<_Ty{kb~d>x%G#DAaQqQ=5SNGp7SI@FW-g(Tb1eY10h3C+>rn6 zl5zT~2`*O>deK+cyjE|PoM9;7;vk^|_=BtZwKZo7f#ufLin_C--`K|6$_vD)CsR{z zqa&Z}{*-Z@Q+le&so=f1$`1Y&X$qE4G zp$SFOlg}s-y*+RjRBO8eQ(yN(m@NgS-xrCTZJ8m0$TbKDqxRX~(y?X14(6SfFw8Z- zi)w$QZ^v?I-KmA(Jy&al2W~2=Y{aZ#zvMa)&FG(4$#MhzHXt87?u0+RH zap)F*1_0#-Rt5_O-$sHFr~~_g-3W{uz5o+EC=|t;QF-p;#9n$gpb8a<&ueKB`k6TQ zk~;DeYCrqsH7;3VdnQP1?hR`1u(LG>ziiHQcZIMe*R_#D^4L%}yjz@=R6U;h{Z zxoExfEpb|hC%>19C&#S2XOEhNJJ9o3sC*Wg;I?GKsa_FZhj8*UnjmG(n_=u(DI(8uyYF&VSkqr+ z2t@>7FasuTyOw zZ8a;6(K*AR@l>cHZs{g+OgyLW+p$1Y4F3VVzM(!Z@UBJ`(xwNEg|5$Ef3t) zRRFleFd6X@h)=3D3IP1F?X>c;_j6bLv? z(h<-QgCbDZdnrHt_$$~IrgeP(M}PstsX_WDNxi8PcQPko0(8SZ?uRYRHagVrJ?O2f zcifT|m&EZ81;+7k2Cu%1ksM=^q>D{XJ94WhnZ4+b)?s{g<)h<#uE8d zU4jXnt)R^QV0ZK5Mjrquriix7w(6^&iGi)xc}h- zs5C7E-UBZ28$F=M9sid)u+N#9e@y|Ia^><64GfYJwH@zEafyQQ6&OJTgD3xCaP5dO z`(7m}&`N~DoXM+0Zn{uL`%Zb43@(@Y0G72)K@Fhb-T~tp^~4Y7>N%eG%`iy}t+Db+7DbI*Q5=_!4!1^Xas^iaq<;MOG?s3C_lWx^mY-*?Kw| z%Wiz!F>i^mPZgm(a=r4QDl1DrOdc7+6=rU;1#^a5Un>C|4kQ`WpZp?{04P%x%&zDaT?H)PFff-`hpaNw z0oQ&G2d;6u_xD%UizJ2emI{#!aBzE$N}s;`4MIOYK8%%gTi3kxl9+&$P#H|EZ^m7O zpU8`z%37<$7!lM2n1dG>uF?VtU(=r%)<#8-jy90(FTbOI*wx$2m>H&{R?Nq{d375MqX?RfTX71L2J0fhL}?0^odev)uMP>2sDbfEjpO~b zyMFr{lNp?OhUGR&g@%>6VEWXi9FkVci9#fJJ;6@LBI8kiD+Uw)coKR~T*xAjo{Npm4Q%%nuw0Ij zYt2(kI?<@z2=X96a}4J&13A%O4~ZlDQl0`{fO=vA2oW5z71cm%<)@{d8Oc6fpHDE& zrQ*D;1IE6!Y(fx+r0 zR}X@T5I2}X+u4RaM@UfcRcYUYKrDyK5qiNdYer&KnhU5jvzK``EB5QFW?+ie8jMf< zsIW6sIpY|$KHQ#n2CO+7(1C0{m(um47qvy}W-IFgvbfCgYAG0uOJAZr8DoXiRY^m? zu7OaMPB0}g2iVzx{{7v{EYQCoiaVa9q6FkFFDtn#pyo`a@jvNF zRonah>lZDl*e`sWgn=k^;l{^UOTe-`b9fXO+)>F2;MhAjOI*$TX<345f5|Q zWY^DA)5C-#`T>t6KmTeC9|0uo8GY~Ylaz;>QDB}e;XB@u4At?uIIN9xNTKCho92-c z*Bo071j0@5PjUuSbbgVO`t~pr+QWBC=FiwIdNKPSZAKugzcO5CC?*Mh7XXYKzXqI% z>~2?QVyGs#Irs-4ASJ4Q`JpXyLPme^%LZK8?_59Y17_IDCoD6pSyfFfQ*6RL5TKDc zkBz`M0Li?%Fk?safTSZlLURdRqu>L)NusK`D1TcYxr2jdXek`|i{=^`+`4p|`lmbg zyw}7X(OCjuPLNDEyy1QVYJmb28fv{Ve^Ngvf(W1)ajLuW;~bGtf49!IgC71QCF}Y| zgtPC#`PCS!tZbEw03Iojsm+PaWC57SoK9Kd^7{d&eXV`=U1aG^BY$ApLiJ#%5UEtOTUN6i&@E|VW39nKur}kcvM4msLU=)L=d37;qw5%px0_(5yQw?nZNnU~1d93a zV}H_Y4Xh0r$827OQDUzmK9x~P``JZTk?po}8RixmJmhU!8ZXC_KxzzNQZUILMx9f; zZ7segQ+)1KQrs=0%ARz5c#TuVQ|@$k06W(@V=4$dzI5f2EEzbpI#V@**$hlKu-*Ds z#(10KyQ6k7%yy`aF9BEp{-AK=r^Yjbs~=2hmW*0JrdjA)k|g6*QN>^3#&z0M8H}hJ zqEtJexC8}dkP2v@5f2m5Gf)((Axm2ZKip?c?*Mj4qH-o>H&=;zQVTF?IQWSas3_1i{~ZSumRLrydUylM72p2BJ=1Q zxyAJLdPZk*8tb0QYNy2yEe}M&C_KAHeA!LBRv$oWi=d~|37MiKcPFM-gEkOazkX-; zR1PGChtG=#o{qwV`5U~J-z6-a{+UFO=!42MZK*FiL~_OJYbZsQY-Xu7MYJ!4a>O-2 zUv~Rfz;aATwB}U-Td4Ot_qD;GApo}3dl79RgLfTG#we?qpPz3NQ45@S*imrL41qPz zEFF#kpj4tX0IB{J`@ftgead%%kE+lL0&CYYKvY>#R5&wSA-sbuCA*uesY|ou^7|*v za?JR4uLm1oPxh#Y*0NV6GBD~}A+XVImH=X>m##8GPmkveI{H7TBLQzGyj9d1(j7U5 zogI#eQP7s&3Q9B;bqzu!yw(lYW-=4-SNMQ%Cp~1t615Kk&8we^5-tHgS%C)_4*&5u z05wtdoOSE_8+_8MXs2Eoy$+FIr<-qMLaup+g5P$Kk#t%h#{NJH$mo*WQ^@@C|I*LE zY?Y0ow?G#dN>leX1;b=Z*bstsBcR=t>&vWPVVm@fKD-vf|9^`6@_4A*wtX`Vh9P6g zzKk^z5vdp&Ywk$4c0$S$BHV>6W2Z=wB0`qXeUm+DAzLakmdcW%q#;5nJHPW9^*s0U zd!Nty@9Q&v^pW{~ul2mn^El7rxRfo@=^U^)*#2!@V|xbqi9|{J9O}xzWbkgTT}vfA zZk7TPMQz8gBuFHz-m_jcTO8V?zIuG>P3_97QKb(Pz#hE45cuuc#zK%hm;s8XIk-=* zusE$j=HbtP5AckvzSb1gaPgoSRIM7jFd4G)J#)0|g>nv{+47eHHFLn1fEBWiqd?z_ z4Ns1Wm%$vxRiL=z%F>RW(TaF%4V-DGBwSYdt1cRDBJ{NHS|zKz0p44IMNR=AHU1h? z6^U@%-LX^o!0Zc0W%rQA=4_zMTe5Hp8+>_l_l;cEx^<3obx_>cFc9fa0)dZT`6Bx2 zewGprd0Je;;2;b?5X>Q6&-v=7r^d0-(a}cMX0KP@8~_X zo5n8md)DT`;b8$0+J4^R9h3d{5}FevxG)nwQ{d$4q$LbdNY;$S%D@jiFk*Mcqe?GO zlOxYDr)vJWsmSJjA|&k$63E~1P;hQL zCOF{-=hGlyn4`VUnfrZi`9Ejf_py#|eMrMbpoY8&urg}scyQaG-d8K@3wr_)1cp)x zi=winTHaD+aRV<&?Rx$K!A_- zFptzeu+rukoCBI3ryu*Wxjd}4iRRu8K0ltf&ZlJ~3hTT^vbCOq4=a|l^^PQg4ix6t zugydMSzYigzU}*s^73+55Qmw^%>XwO3A`M9;JZ}2I=lK!HG-;mJjm~+vH>Ox&xBtfD77$7U3S|8b)HEtXrkeyt|4kx4lC5mJEZS~$ zu$m@_liEwo6mWRpr`S<)?863tOY3j258dmBO6QHArgbGY54+d+DOO*-%J;!))oa6E zAXD`M8EEio9q=%K(D4c-Ve{|dUSG=J_^l?fcIC(2$GvMopr?!q5zj{g)1hqlm^}Ti zVd(TjH;piN&MyK|O?(_e?m>7H-^1{|EOJ;0w*GyH*g zA%J=6)|1wexa&IDD$iGn%TnC}Y%?6#C&Zq6o)V>pPI4>xKX)s8mtvp5z_WsAN`634Tn0P&=Xmd}*(Og`@IHh4@4At_It=-j`%J0l9uK}q z*d`x*$#B?RIL%iVi|rfPXVMthC7G2VuDz$yEnh|^6@E(MyI6pWA$~IGVU*7Dj1|Bb zNnQPM?z1yp`*^oRozMxqBT>ABbGIAMS9}K(YkM}^j;In(mDoQ-x-($5!{isS$E-d^ zLlbXIphLlP7ib?Hx8m9)r+&_V?_z zGXp}(wwF3~oZbgW)30(>xa5|lIMfIrTydI>o_<|)IPi;sC}S*|!<8)X(>}JiT;`dY zKi!U}d8O-f3Tt$p^uDtEZ6+Sx%35~tc0@U3CN4}IODt~mAua~(nX}iEfUtu%FtG$< zBO{-kAkRxHRf}TN3g#2C;#X$9{3ykB>mc&x%!t@(s@dBDLxzSSr=NW`_j$xPqX%&2B=`n?<>-ns6O)%Tge>0 zI~oFL70uy61w7xrx@RkGW_>9whZzAdxyRHr&86o=ICZ3uOU?PEby)ZCm*Hngdv<*H zjd#urx>j>`;#ArFTa|mEGwk@g4;Ff#H(i~pyX3+vUtBYOdyj{fA>O55T2ykiUO5YB z-KOB0YbqUk*h4R9OI6z)`x!ipP1CK5`#*N-18G&;rb7|XziAwM+WYiYvTNGTi^$5j zn+cQ$5gt%a)3QQu)O0`$Ev@U>Qxa+vFKkHOmlmlu`901A3ClbRL?Vrp4%~-xJyT^? z(F$>SsLoJ>nQuHsJXD212c42mLX{qz1V^f|3c7+81vNyO*+5=7ac2C zEb0sya)zeVS-%m(4@;b`KxWhDG-S{b$9$(=%z3$o2{~Z~prAom-Gx}`_U7f?EIHBW zgbz+bfuIE=n|}W1c9>CnZ zcFhP%&$FPEZ!YTR%xG7|xyfTtpX{9B^6qhv7L>MMfD@x=Wl)9heZ9pnrITxEP&=`d z$>zikBv%(Yi~wv9gA+C)#bE=$9yOjnb$0TdtzsLvIkGAKIwGsRwIQ`P+M5ab-iAJ~ zCo21>F9&$1Y%WjL*rlIOI>U<4OM@^5+)3i`cg#(4;G_9`ewhbYg4^fAkO3nKrT9(8;oVx&RXa`rPM>p;94s01#`0t!OOtqSZ+rCX{WvtB)9`de+b!UMe zelSi%6ayZJS4PVv4&^d(hX~#vl!`36Ci`JtZVAaOX&#qqA%B?R`j&OfOvD%_%)Rz_ zgZFP4$E?)l$fz1T#>2(lo*&#ruSF?7aq$6^i@5xIB}A(HwOJJe2@)yw@nnP^9;K~8 zG$i6NfGdaM#WruDAR@Pe2oM(CFUl_g1H1%Di~^!`ts9>Sp#hTiR0iNzeJf}`GU0%Z zi(D(Ek8%MR%q)z{fLeo?6EEzLw2300FLg~j6)Ql(ZSD%ABf_aCIbjRB>9OsmWF10F zb#QH|&iFvi4Pc!Ro*QG5xQfCnp|&Iv!V2Ww!~i`cs$BWqhtw2}juME-h0k0{ypFoi z6UsoD{*Sr^f9p;4u%WwCy=sog#FJigXGk^o_aNy z94{Ep_2-uCgG8ahx#1q5?@;m&-3j3hyhkmi10mBKy~U}d+7D|)aFG}hl-h-ctjAb3uEOV32F-0jGw%WfdAu_(p&d?Jzy|vq7Eh z5rD$q)Vluqu3hHU+S8{u9j)5Dzt|=fG|#eEMs|_4>y`*d^-?6HA)gBm?LZ?OpHVLG zXwK;QM-_H@Z@IG-L|KI>nd+FFl%x;;$b&kU!d;8AlkL3S0GecjD5cfEj5S5KUR&)g zLx><46>^7fZJvsx2r{dO|6yX11F}Wt5UvFdHHHJl_6XY;I8I3P%LQcCDuNczKHt!_ zxxnq!olj}nf(2e!d1I0q3`DkBUH7CUzdwUlieMWE5rIPG|YG3F`k~2ypPcG$?s8 zrb2KTc@IGnP+R1I7JtBP2l8^AU#8zedP_^Syqq--4J?2Q@tr(*vZK6R#{{5_*wati zk-`yLAA8XHc$NNW_|C`y7Oa{7M!?s#L4Y;@D&|m!2@kbYhPHs*QNToHB}#| z^ZCddlC%X6JO5s`Ee0Dqg3BREUfCKeZxR=(gGSqkbOyc1jZZ#^X^Xl^_P30sL+(Y98N1rRd&AJR&@!*vdcE!S2*(yF&0`4bm_kRlAEEK}>}I%$%Dd##E+kOBs>& zvq`;79FYB;ehLZ-GtDBN<{(j6(P$Y>bJ z0ay;ad+QDnoxtjA@?$`F9ft^d^#11zt7HU~xRy%Xgk``m60|kB8fLLh`X$ec)MMpN zoYPlhAfI)L?Y0@Fjm3w#27HqlAZu7c&4l(GwMj+Z*w0wvEj!w3!eEWvA}$s$%Od53 zQ-D+EL0n>W%L>ieS!Td6xzbvNsNadYs2@5(ADNIBq9I}rV#Y+SK zOw0&ha^DNv7dq*6iv>hk8cDa}!&a0~3;@ zA7utFxPtai#zNBws5$w#ISu#ckhtghn3!Nf^`Vy{!h$IqL_^=6YJphnDmN7Mygp&t zQJXDF_A}r6aSni`rl&vu!rpZA1A>c!mR6cmdxp|if+pBjm3T_eo-Mbh!?hjOG-lXL z=nl?O*ac?aX@2X!4#fLy+6_@MPwLp%=U{@1#@CHqiiuw(Y&p4C9PG_EJbR zVdr_dC?O45eUi(61nSRH?1r^<@pPc3Tte)cfR*{rg^Q1>F&_((_h` zokwH0z+>bPr9$31C5N@Yk_Uf;!X>md;*j5-Nmj84>IkLnrq)5RsxtrYPMZ#w<-YFe z?cB-EgZxW_WG1@Ahw;-M&V9|hek^V_s5Nr{BzG*8Z%O<*Lm-0< zhElHy=W`>lt)q@bO_%cK&VG};Zx6MFkJRQVZ^s^a!{z{qwp>V=(L&d;A_`NociW%4$a%y6MLcz6 zdZfV)q*G1Ho!TsSogWNkbpdJBQ|Y^wNB60F4;ydDL}IFTc(7+9eNi7y$LQ(m@d;{z zvj-A~(B(y(a6?1_l?}Uau69uj)%11)^F);zSfO#zQ0E(Y<^Az>JH})FqAgu~Vz;_* zF#24}cJKz$#%7*v%*+K4m&Pg)NP*OKKHv@(fT6t_jRigD@Kb7M#}7d{zwjf_E}NMQ zSv}emvG2rqU*%sPT2`;|)8vg?o|3m}fB37jB|`WT3sM6HeMVD~>K!tM7v~FV1Km21 zDDV)tXw6@e8M5MUUp&p1it@6cfBoHk&{Y=bU)HtuP#eB73G$j2$z9|G&nqF=u>U=& z80s?Y+Ejr;E-?`Jz3mRWSV$9r{&w~8`PtKmRomBfL%`shnL-T?SbMrBm>H_cp^eD1 zP}92@!vhn^1@hCu^DpdpRy{seg5oMtJ^>ofF3v{njOX=Ie*axeRo;~1({$sr&UcG1 z<<9K~_Pf|(HHq?qYnGQJiMHj1KlDaih&)(1JRQLF8{XdD^uqiMcD8M^P9W6>?26(d z{x5&nl8fpmntW~ojoxFdD?dSV`HG>h16C7=Y?F_!1N+_ZV{?3$T$XD5D-XU7ab(#U zq_9$YQ)Zn5A9A36sEu$RqM+od@AmZ@u{ZLM+xUMig*@rP;YtX?-p7T7atW$jg z5|0(92Q-h`bdIpH^YqcO9g%68GGJ`O4+`Sdy(FwIfexO~Uyj-SU)0;LOTO0=2i+Rr zy1f#A4i4?N@oN)eU^2xW=2#&cegND9&A&x|Dv=0ZI^IP(g-#0?aQLeehBA{C~xn z!+r_=a?8S4Sg6Lj$Q`DirD1FIqt|x>SXwht)vvejdIvP#urX}u%c1Mgh=AuV z2VYWk-qOc*GHDk22b|!J&ODPsfUj;n4FKI?E4X38Wrp4XAn-m`^UG678qEy2;WO-v zo8@{hVz}{^6bZ85<+0aACU&4*PA^3DRR4sI;agCv$1t$Y$oJVK_p&Z0c^(Hes2H|d zs6v)i*HBYaLu?_Sjgg-(_;Cg;jOJIkcFE=66YBjsnx83mjN@70ob@i7uVA4ce2jbz zO^@Uy9+SegsvDqe$>ZN7rDA>uo|WuUCYM;+KJpq_cy9A6|P zz|6+LEtqhdrJ*A8FlESWjx9GgmnP!*P#2sS_GGm{ zP*|6{5P9S@`T(Uk*>7a|&Y52-o6sO|_TgR@%Z0jwe_%O<)y=K8_f>f)_7)wo`&FvM z-QERyl#Aq#ohE?Xt|6~bnqdNn#$oSjE*y@{^rmL=v7jIOKkRI}ZA%bP&V>q-R44-6 zixfNZ2_L>iGqLlmcs0wTAsoC`cNp9E<@G{AN;M}2F88s3L&FtJKO|_h9KEJ2-fm6@ zvDRA=K5&f2mnv+)3RT*kdtyzfD1#2F=?GsdloRV

g+|4HH5<>u_F`x_pCq&qyS=qF|PIc(@LU(c*Y=;PONP^$rns1BJ!dC49+K7o;|Y& z^M_b{tQ|RrYlV8rOOsw-H@$hv-6B#a5toezGbKx7WoNW|b+n%V42rUo> zou^jb9nffK7M~23dPx$233V7ir&uqCd3eidEbV-9gW3VV#Y)1^k$P0+(K}?2FyTi< zxur=ce^Qj5n~aO&_~E%UOZW1F8j?{^5BCv0*VQNOIX%z$&A&2m-unpLGEmRDQ+Ta` z4DI(tHytC!@d1USS~BGy*L^|5KoSC+?wNUmHuU=d54ERq>)*~=k=wet+0@_SFhMX& zKS~YT*T!BBRdlOvDq+Lv8Nz5;4~3QfYf|7Jx(IF4#0oOtLU^{jB-P&>MPD-i2~)zn zGGPSZ$+mTRRyT3xRkUB%l~DPye!gx`E||4}fT>4toW10)0Y<%`>cTfT*;x?E$an%{ zYSChwR}G8&XFFJc@u49vsKW3UQ6JG52SPVTp5pm`;RlR)6EpyKE6cu)aSPkpGfQqz zWjBWEQI6is^IFgN=GyluH{eC;7BjFTVHpySV0&KgFuhftdsRqoxMUl;)GYCTz0_>& zDWt7fVY?TSy=c~de`N3mMii4eJ&AvIVT60?f%(EJMuuPP!Vb^kbSC)u!_ds2SkFG} F{{imZ4~_r; literal 0 HcmV?d00001 diff --git a/content/blog/papers/charlib/operation.md b/content/blog/papers/charlib/operation.md new file mode 100644 index 0000000..9d47287 --- /dev/null +++ b/content/blog/papers/charlib/operation.md @@ -0,0 +1,106 @@ +--- +title: 'Laymanized | CharLib Part 2: How it Works' +date: 2024-08-07T14:16:52-05:00 +draft: true +math: true +--- + +Now that we understand standard cell characterization, we can dig into this paper. As it turns out, +understanding the background is the hard part here. + +The paper is pretty straightforward after that. + +## CharLib: An Open Source Standard Cell Library Characterizer + +This paper, published in the proceedings of the 2024 Midwest Symposium on Circiuts and Systems, +describes a new standard cell characterizer written in the Python programming language. It's open +source and designed to be simple to use. + +The innovation here isn't in the details of the characterization process. That's mostly the same as +what other open source characterizers have been doing for years. Instead, CharLib introduces a new +way of handling standard cell information with the goal of making characterization easier and more +consistent. + +### Section I: A shift in perspective + +Existing characterizers follow a typical paradigm. You more or less tell the tool where each +individual cell is, then load the tool with information about that cell, then tell it to run a +specific procedure. This is a pretty manual process, with the tool only handling the actual +simulation automatically. + +For example, if you wanted to characterize a cell library using Cadence tools, you would write a +script using Cadence Liberate's domain-specific commands. There are commands for importing cell +data, defining paths through cells, defining test conditions, and much more. Learning all those +commands takes time, and characterization has to be kicked off manually. + +CharLib, instead, tries to automate the entire process. Cell information is treated like metadata, +which can be stored with cell netlists or in a centralized configuration file for the whole cell +library. Instead of configuring the tool every time you run characterization, you describe your +cell library once, then you can use that configuration any time you want to run characterization. +It's a shift from prescriptive programming to descriptive. + +One of the big advantages of this is that you can store cell information relavant to +characterization alongside your cells. This makes everything simple and bite-sized: you don't have +to have one massive script that handles all the cells in the library. (Maybe someday you'll even be +able to store characterization metadata in the cell netlist, using a special comment format or +something. That could be pretty cool.) + +CharLib also tries to minimize the amount of work you have to do by letting you set library-wide +defaults that cascade down to all cells. There is some information that's different for every cell, +of course. Those items are required to be documented on each cell. But everything else - even test +conditions like slew rates and capacitive loads - can be easily set once for the whole library. You +can still override library defaults by specifying settings on a per-cell basis, of course. + +### Section II: Nuts and Bolts + +When it comes to characterization itself, CharLib doesn't do anything new. It uses tried-and-true +methods to characterize cells, leaning on the work of previous open-source characterizers such as +[libretto](https://search.ieice.org/bin/summary.php?id=e106-a_3_551) and +[lctime](https://codeberg.org/librecell/lctime). But just for fun, let's take a closer look at how +it works. + +The characterization process for any given cell happens in four steps. Each cell in the library has +to go through this process. +1. Identify Test Arcs +2. Measure Input Capacitance +3. Measure Delays +4. Collect and Present Results + +Let's go through what each of those means. + +#### Test Arc Identification + +For starters, what's a test arc? Simply put, a test arc is a path through a cell (from one input to +one output) where all other cell inputs are set to nonmasking conditions and we can observe the +state transition we want. Even for a simple explanation, that's pretty jargon-dense, so let's look +at an example. + +Let's say you want to characterize an OR cell. You start with the path from input A to the output, +Y. But what do you do with input B? If you leave it disconnected, your simulation won't represent +real-world usage well. But you can't just set it to a random value, because if you set it to logic +1, the OR cell will always output 1. You have to set input B to zero in order to observe how the OR +cell affects a signal on input A. So your test arc is the path from A to Y, with input B held +stable at logic 0. + +> TODO: image of OR gate being tested, with masking and nonmasking conditions shown + +Which test arcs are valid depends on the logic that the cell implements. This points to a very +simple method for identifying valid test configurations: comparing rows of the truth table for the +cell's logical function. + +> TODO: insert image of truth table with rows compared to identify test arcs + +CharLib's algorithm for identifying valid test arcs first builds a truth table based on the cell's +function (which is part of the cell metadata), then steps through the rows of that table to +identify pairs of rows where changing a single input produces a change in the cell output. This +works for arbitrary combinational logic functions. Sequential cells are a little more complex +because of their internal state, but the same general principle applies. Here's a flowchart showing +the full process. + +![Test arc identification flowchart](test_arc_flowchart.svg "This is about as simple as it gets. This stuff is just plain difficult.") + +Once we've figured out *how* to test our cell, we take a brief aside to measure cell capacitance. + +#### Measuring Input Capacitance + +To measure capacitance, we model (aka pretend) that the cell is a capacitor connected to ground. diff --git a/content/blog/papers/charlib/test_arc_flowchart.svg b/content/blog/papers/charlib/test_arc_flowchart.svg new file mode 100644 index 0000000..88b9f6b --- /dev/null +++ b/content/blog/papers/charlib/test_arc_flowchart.svg @@ -0,0 +1,3 @@ + + +
END
START
Are there 2 or more rows left in the truth table?
Evaluate the boolean function to construct a truth table for this output
Yes
Remove and store the first row
No
Fetch next row and compare
Is the output different and only 1 input different?
Construct a test vector from the two rows
Yes
Add the test vector to the list of test vectors
No
\ No newline at end of file