{"id":5292,"date":"2026-02-10T01:32:45","date_gmt":"2026-02-10T07:32:45","guid":{"rendered":"https:\/\/ykim.synology.me\/wordpress\/?p=5292"},"modified":"2026-02-10T01:32:58","modified_gmt":"2026-02-10T07:32:58","slug":"stdf-standard-test-data-format-in-semiconductor-industry","status":"publish","type":"post","link":"https:\/\/ykim.synology.me\/wordpress\/stdf-standard-test-data-format-in-semiconductor-industry-5292\/","title":{"rendered":"STDF (Standard Test Data Format) in Semiconductor Industry"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">[Gemini]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the semiconductor world, <strong>STDF (Standard Test Data Format)<\/strong> is the universal language of test results. Developed by Teradyne, it is a binary file format used to store data generated by Automatic Test Equipment (ATE) during the wafer sort and final package testing phases.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Think of it as the &#8220;black box&#8221; recorder for microchips. Every time a chip is tested, the ATE records whether it passed, its voltage readings, timing measurements, and binning information into an STDF file for later analysis.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why Use STDF?<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Interoperability:<\/strong> It allows different ATE platforms (Teradyne, Advantest, etc.) to speak the same language.<\/li>\n\n\n\n<li><strong>Efficiency:<\/strong> Being a <strong>binary<\/strong> format, it is much smaller and faster to write than text-based formats like CSV or XML, which is crucial when testing millions of chips.<\/li>\n\n\n\n<li><strong>Data Integrity:<\/strong> It uses a structured record system (e.g., MIR for Master Information, PTR for Parametric Test Results) to ensure data is organized and traceable.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Example of STDF Record Logic<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">An STDF file isn&#8217;t human-readable if you open it in Notepad. It consists of a sequence of variable-length records. A simplified logical flow looks like this:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\" style=\"padding-right:var(--wp--preset--spacing--80);padding-left:var(--wp--preset--spacing--50)\"><table><thead><tr><td><strong>Record Type<\/strong><\/td><td><strong>Name<\/strong><\/td><td><strong>Purpose<\/strong><\/td><\/tr><\/thead><tbody><tr><td><strong>MIR<\/strong><\/td><td>Master Information Record<\/td><td>Setup info: Lot ID, Operator, Node Name, Start Time.<\/td><\/tr><tr><td><strong>PIR<\/strong><\/td><td>Part Information Record<\/td><td>Marks the beginning of a specific chip (part) being tested.<\/td><\/tr><tr><td><strong>PTR<\/strong><\/td><td>Parametric Test Record<\/td><td>The &#8220;meat&#8221;: Test name, actual value (e.g., 1.25V), limits, and pass\/fail status.<\/td><\/tr><tr><td><strong>PRR<\/strong><\/td><td>Part Results Record<\/td><td>The &#8220;summary&#8221; for that chip: Final bin, total test time, and pass\/fail flag.<\/td><\/tr><tr><td><strong>MRR<\/strong><\/td><td>Master Results Record<\/td><td>The end of the file: Total parts tested and finish time.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How to Handle STDF (Python Example)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Since STDF is binary, you don&#8217;t want to write a parser from scratch. The most popular tool for this is the <code>pystdf<\/code> library or <code>semi-ate<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here is a short example using a typical parsing approach to extract <strong>Parametric Test Results (PTR)<\/strong>:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#24292e;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#24292e;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly># Note: You would typically install a library like pystdf\n# pip install pystdf\n\n        \nfrom pystdf.Operator import Operator\nfrom pystdf.IO import Parser\n\ndef process_stdf(file_path):\n    # The Operator class acts as a sink for different record types\n    with open(file_path, 'rb') as f:\n        p = Parser(f)\n        \n        # Define what happens when we hit a PTR record\n        def on_ptr(record):\n            test_name = record.TEST_TXT\n            result = record.RESULT\n            print(f\"Test: {test_name} | Value: {result} | Pass: {record.TEST_FLG == 0}\")\n\n        # Link the record handler and parse\n        # (Simplified logic)\n        for record in p:\n            if record.REC_TYP == 15 and record.REC_SUB == 10: # PTR type\/sub\n                on_ptr(record)\n\n# process_stdf('my_chip_data.stdf')<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-light\" style=\"background-color: #fff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A737D\"># Note: You would typically install a library like pystdf<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\"># pip install pystdf<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">from<\/span><span style=\"color: #24292E\"> pystdf.Operator <\/span><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> Operator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">from<\/span><span style=\"color: #24292E\"> pystdf.<\/span><span style=\"color: #005CC5\">IO<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">import<\/span><span style=\"color: #24292E\"> Parser<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D73A49\">def<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">process_stdf<\/span><span style=\"color: #24292E\">(file_path):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #6A737D\"># The Operator class acts as a sink for different record types<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">    <\/span><span style=\"color: #D73A49\">with<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">open<\/span><span style=\"color: #24292E\">(file_path, <\/span><span style=\"color: #032F62\">&#39;rb&#39;<\/span><span style=\"color: #24292E\">) <\/span><span style=\"color: #D73A49\">as<\/span><span style=\"color: #24292E\"> f:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        p <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> Parser(f)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6A737D\"># Define what happens when we hit a PTR record<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">def<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #6F42C1\">on_ptr<\/span><span style=\"color: #24292E\">(record):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            test_name <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> record.<\/span><span style=\"color: #005CC5\">TEST_TXT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            result <\/span><span style=\"color: #D73A49\">=<\/span><span style=\"color: #24292E\"> record.<\/span><span style=\"color: #005CC5\">RESULT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #005CC5\">print<\/span><span style=\"color: #24292E\">(<\/span><span style=\"color: #D73A49\">f<\/span><span style=\"color: #032F62\">&quot;Test: <\/span><span style=\"color: #005CC5\">{<\/span><span style=\"color: #24292E\">test_name<\/span><span style=\"color: #005CC5\">}<\/span><span style=\"color: #032F62\"> | Value: <\/span><span style=\"color: #005CC5\">{<\/span><span style=\"color: #24292E\">result<\/span><span style=\"color: #005CC5\">}<\/span><span style=\"color: #032F62\"> | Pass: <\/span><span style=\"color: #005CC5\">{<\/span><span style=\"color: #24292E\">record.<\/span><span style=\"color: #005CC5\">TEST_FLG<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">==<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">0}<\/span><span style=\"color: #032F62\">&quot;<\/span><span style=\"color: #24292E\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6A737D\"># Link the record handler and parse<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #6A737D\"># (Simplified logic)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">        <\/span><span style=\"color: #D73A49\">for<\/span><span style=\"color: #24292E\"> record <\/span><span style=\"color: #D73A49\">in<\/span><span style=\"color: #24292E\"> p:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">            <\/span><span style=\"color: #D73A49\">if<\/span><span style=\"color: #24292E\"> record.<\/span><span style=\"color: #005CC5\">REC_TYP<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">==<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">15<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">and<\/span><span style=\"color: #24292E\"> record.<\/span><span style=\"color: #005CC5\">REC_SUB<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #D73A49\">==<\/span><span style=\"color: #24292E\"> <\/span><span style=\"color: #005CC5\">10<\/span><span style=\"color: #24292E\">: <\/span><span style=\"color: #6A737D\"># PTR type\/sub<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292E\">                on_ptr(record)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\"># process_stdf(&#39;my_chip_data.stdf&#39;)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Pro-Tip for Engineers<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If you just want to look at the data without coding, tools like <strong>JMP<\/strong>, <strong>YieldExplorer<\/strong>, or free viewers like <strong>STDF Visualizer<\/strong> are used to convert these binary blobs into readable charts and histograms.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<div style='text-align:center' class='yasr-auto-insert-overall'><\/div><div style='text-align:center' class='yasr-auto-insert-visitor'><\/div>","protected":false},"excerpt":{"rendered":"<p>[Gemini] In the semiconductor world, STDF (Standard Test Data Format) is the universal language of test results. Developed by Teradyne, it is a binary file format used to store data generated by Automatic Test Equipment (ATE) during the wafer sort and final package testing phases. Think of it as the &#8220;black box&#8221; recorder for microchips&#8230;.<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","yasr_overall_rating":0,"yasr_post_is_review":"","yasr_auto_insert_disabled":"","yasr_review_type":"","fifu_image_url":"","fifu_image_alt":"","iawp_total_views":0,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-5292","post","type-post","status-publish","format-standard","hentry","category-semiconductor-slug"],"yasr_visitor_votes":{"stars_attributes":{"read_only":false,"span_bottom":false},"number_of_votes":0,"sum_votes":0},"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/ykim.synology.me\/wordpress\/wp-json\/wp\/v2\/posts\/5292","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ykim.synology.me\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ykim.synology.me\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ykim.synology.me\/wordpress\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/ykim.synology.me\/wordpress\/wp-json\/wp\/v2\/comments?post=5292"}],"version-history":[{"count":1,"href":"https:\/\/ykim.synology.me\/wordpress\/wp-json\/wp\/v2\/posts\/5292\/revisions"}],"predecessor-version":[{"id":5293,"href":"https:\/\/ykim.synology.me\/wordpress\/wp-json\/wp\/v2\/posts\/5292\/revisions\/5293"}],"wp:attachment":[{"href":"https:\/\/ykim.synology.me\/wordpress\/wp-json\/wp\/v2\/media?parent=5292"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ykim.synology.me\/wordpress\/wp-json\/wp\/v2\/categories?post=5292"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ykim.synology.me\/wordpress\/wp-json\/wp\/v2\/tags?post=5292"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}