From 78ce71194dd36b828b7d3aa6f7ad672484432e95 Mon Sep 17 00:00:00 2001 From: Ali Hammoud <70279295+alibillalhammoud@users.noreply.github.com> Date: Sun, 9 Jun 2024 02:47:56 +0000 Subject: [PATCH 1/8] phi, mistral, codestral --- .../llm/syntax_data/convos/ClassABStage.convo | 24 +++++++++++ .../llm/syntax_data/convos/MimcapArray.convo | 4 ++ .../syntax_data/convos/PTypeDiffPair.convo | 13 ++++++ .../llm/syntax_data/convos/PushPull.convo | 20 ++++++++++ .../glayout/glayout/llm/syntax_data/eval.json | 25 +++++++++++- .../glayout/glayout/llm/train_and_run.py | 40 +++++++++++++------ .../glayout/glayout/syntaxer/process_input.py | 5 ++- .../glayout/glayout/syntaxer/relational.py | 2 +- 8 files changed, 117 insertions(+), 16 deletions(-) create mode 100644 openfasoc/generators/glayout/glayout/llm/syntax_data/convos/ClassABStage.convo create mode 100644 openfasoc/generators/glayout/glayout/llm/syntax_data/convos/MimcapArray.convo create mode 100644 openfasoc/generators/glayout/glayout/llm/syntax_data/convos/PTypeDiffPair.convo create mode 100644 openfasoc/generators/glayout/glayout/llm/syntax_data/convos/PushPull.convo diff --git a/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/ClassABStage.convo b/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/ClassABStage.convo new file mode 100644 index 000000000..184d1656a --- /dev/null +++ b/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/ClassABStage.convo @@ -0,0 +1,24 @@ +ClassABStage +import PushPull +import CurrentMirrorNFET +create a float parameter called source_numcols +create a float parameter called gm31_numcols +create a float parameter called source_length +create a float parameter called gm31_length +create a float parameter called source_width +create a float parameter called gm31_width +place a PushPull called pp1 +place a PushPull called pp2 +place an interdigitated pfet called source with numcols=source_numcols, dummy=True, with_substrate_tap=False, with_tie=True, kwargs={ "width" : source_width , "length" : source_width} +place an interdigitated nfet called gm31 with numcols=gm31_numcols, dummy=True, with_substrate_tap=False, with_tie=True, kwargs={ "width" : gm31_width , "length" : gm31_length} +place a CurrentMirrorNFET called sink +move source above gm31 +move pp1 right of gm31 +move pp2 right of pp1 +move sink below gm31 +route between source_A_drain_E and gm31_A_drain_E using smart_route +route between source_B_drain_W and gm31_B_drain_W using smart_route +route between gm31_A_source_W and sink_cm_A_drain_W using smart_route +route between gm31_B_source_E and sink_cm_B_drain_E using smart_route +route between gm31_A_drain_E and pp1_c3_top_met_W using smart_route +route between gm31_B_drain_E and pp2_c3_top_met_W using smart_route \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/MimcapArray.convo b/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/MimcapArray.convo new file mode 100644 index 000000000..151e49b4a --- /dev/null +++ b/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/MimcapArray.convo @@ -0,0 +1,4 @@ +MimcapArray +create a float parameter called mimcap_size_x +create a float parameter called mimcap_size_y +place a mimcap array called arr with size=(mimcap_size_x, mimcap_size_y), rows=5, columns=5 \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/PTypeDiffPair.convo b/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/PTypeDiffPair.convo new file mode 100644 index 000000000..c4e17de0b --- /dev/null +++ b/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/PTypeDiffPair.convo @@ -0,0 +1,13 @@ +PTypeDiffPair +create a float parameter called vin1_width +create a float parameter called vin2_width +create a float parameter called vin1_length +create a float parameter called vin2_length +create a int parameter called vin1_multiplier +create a int parameter called vin2_multiplier +create a int parameter called vin1_fingers +create a int parameter called vin2_fingers +place a pmos called vin1 with width=vin1_width, length=vin1_length, fingers=vin1_fingers, rmult=1, multipliers=vin1_multiplier, with_substrate_tap=False, with_tie=True, with_dummy=True +place a pmos called vin2 with width=vin2_width, length=vin2_length, fingers=vin2_fingers, rmult=1, multipliers=vin2_multiplier, with_substrate_tap=False, with_tie=True, with_dummy=True +move vin1 to the left of vin2 +route between vin1_source_N and vin2_source_N using smart_route \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/PushPull.convo b/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/PushPull.convo new file mode 100644 index 000000000..493409340 --- /dev/null +++ b/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/PushPull.convo @@ -0,0 +1,20 @@ +PushPull +create a parameter called p1_width +create a parameter called n1_width +create a parameter called p1_length +create a parameter called n1_length +create a parameter called p1_fingers +create a parameter called n1_fingers +place a pmos called p1 with width=p1_width, length=p1_length, fingers=p1_fingers, rmult=1, multipliers=1, with_substrate_tap=False, with_tie=True, with_dummy=True, +place a nmos called n1 with width=n1_width, length=n1_length, fingers=n1_fingers, rmult=1, multipliers=1, with_substrate_tap=False, with_tie=True, with_dummy=True, with_dnwell=False +place a mimcap called c3 +place a mimcap called c5 +move p1 right next to c3 +move c5 below c3 +move n1 below p1 +move n1 right next to c5 +route between p1_drain_W and c3_bottom_met_E using smart_route +route between p1_gate_W and c3_top_met_E using smart_route +route between p1_drain_E and n1_multiplier_0_drain_E using smart_route +route between n1_drain_W and c5_bottom_met_E using smart_route +route between n1_gate_W and c5_top_met_E using smart_route \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/llm/syntax_data/eval.json b/openfasoc/generators/glayout/glayout/llm/syntax_data/eval.json index 64f5eaa1d..93dcba856 100644 --- a/openfasoc/generators/glayout/glayout/llm/syntax_data/eval.json +++ b/openfasoc/generators/glayout/glayout/llm/syntax_data/eval.json @@ -1,12 +1,33 @@ { "data": [ + { + "NLPfilename": "MimcapArray.convo", + "LLMprompt": "Make a mimcap array called caparr with 5 rows and 5 columns. Parametrize the size of each mimcap." + }, + { + "NLPfilename": "PTypeDiffPair.convo", + "LLMprompt": "Make a p-type differential pair using interdigitated placement. Parametrize everything." + }, { "NLPfilename": "StrongArmLatch.convo", "LLMprompt": "A strong arm latch consists of a diffpair, a CrossCoupleInverters, a bridge nfet, a clkgnd nfet, and two pfets clkpwrL (west) and clkpwrR (east). The cross coupled inverters should be at the top. The bridge should be above the diffpair but below the cross coupled inverters. The clkgnd should be at the bottom, and both clkpwr transistors should be left and right of the cross coupled inverters. You must route the drain of transistor A of the diffpair with the drain of the bridge, the drain of transistor B of the diffpair with the source of the bridge, the source of transistor A in the diffpair with the source of clkgnd." }, { - "NLPfilename": "BiasVoltageGenerator.convo", - "LLMprompt": "Create a Bias Voltage Generator by placing an nmos and pmos side by side. Parametrize everything" + "NLPfilename": "ClassABStage.convo", + "LLMprompt": "Place two interdigitated pairs, one a pair of pfets called source and the other a pair of nfets called sink." + }, + { + "NLPfilename": "IntegratorStage.convo", + "LLMprompt": "Create an integrator stage. This can be made with two pairs of pfets and a pair of nfets. The first pair of pfets is a current mirror that is connected to a pfet diff pair. This is then connected to an active load. These components are arranged top to bottom respectively. Parametrize everything" + }, + { + "NLPfilename": "DeltaSigmaModulator", + "LLMprompt": "Create a delta sigma modulator. This combines several different components including an opamp and a latched comparator. The latched compartor includes a d flip flop and a strong arm latch." + }, + { + "NLPfilename": "NtypeCurrentMirror", + "LLMprompt": "Make a current mirror using common centroid technique." } + ] } \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/llm/train_and_run.py b/openfasoc/generators/glayout/glayout/llm/train_and_run.py index afda17b47..f2ac20c69 100644 --- a/openfasoc/generators/glayout/glayout/llm/train_and_run.py +++ b/openfasoc/generators/glayout/glayout/llm/train_and_run.py @@ -64,7 +64,8 @@ def get_huggingface_token(): #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 accesstoken = get_huggingface_token() - +microsoft_model = False +mistral_model = False # returns model, tokenizer def load_model_and_tokenizer(device: str, lora: bool = True) -> tuple: """Downloads or restores model and tokenizer @@ -83,9 +84,14 @@ def load_model_and_tokenizer(device: str, lora: bool = True) -> tuple: RuntimeError: If there is an error moving the model to the specified device. """ qlora = True - # load modela - # modelname = "mistralai/Mistral-7B-v0.1" - modelname = "mistralai/Mistral-7B-Instruct-v0.3" + # load model + modelname = "microsoft/Phi-3-mini-128k-instruct" + #modelname = "mistralai/Codestral-22B-v0.1" + #modelname = "mistralai/Mistral-7B-Instruct-v0.3" + global microsoft_model + global mistral_model + microsoft_model = "microsoft" in modelname + mistral_model = "mistral" in modelname if not qlora: model = AutoModelForCausalLM.from_pretrained(modelname, token=accesstoken) else: @@ -163,12 +169,13 @@ def train(model, tokenizer, data, qlora: bool = True): per_device_eval_batch_size=batch_size, num_train_epochs=num_epochs, weight_decay=0.01, - logging_strategy="epoch", - evaluation_strategy="epoch", + logging_strategy="steps", + logging_steps=2, + eval_strategy="epoch", save_strategy="epoch", load_best_model_at_end=True, gradient_accumulation_steps=1, - warmup_steps=0, + warmup_steps=1, bf16=True, optim="paged_adamw_8bit", ) @@ -230,9 +237,12 @@ def run_full_SFT_training() -> tuple: per_device_eval_batch_size=batch_size, num_train_epochs=num_epochs, weight_decay=0.01, - logging_strategy="epoch", - evaluation_strategy="epoch", - save_strategy="epoch", + logging_strategy="steps", + logging_steps=1, + eval_strategy="steps", + eval_steps=10, + save_strategy="steps", + save_steps=10, load_best_model_at_end=True, gradient_accumulation_steps=1, warmup_steps=1, @@ -240,7 +250,12 @@ def run_full_SFT_training() -> tuple: optim="paged_adamw_8bit", ) #training_args = TrainingArguments(output_dir=str(output_dir)) - data_collator = DataCollatorForCompletionOnlyLM(response_template="[/INST]",instruction_template="[INST]",tokenizer=tokenizer,mlm=False) + if microsoft_model: + data_collator = DataCollatorForCompletionOnlyLM(response_template="<|assistant|>",instruction_template="<|user|>",tokenizer=tokenizer,mlm=False) + elif mistral_model: + data_collator = DataCollatorForCompletionOnlyLM(response_template="[/INST]",instruction_template="[INST]",tokenizer=tokenizer,mlm=False) + else: + raise ValueError("could not find a valid model, please specify a model type either mistral models or microsoft (phi) models") #import pdb; pdb.set_trace() trainer = SFTTrainer( model=model, @@ -306,6 +321,7 @@ def get_base_model_name_or_path(file_path: Union[str, Path]) -> str: # model = model.merge_and_unload() # load tokenizer tokenizer = AutoTokenizer.from_pretrained(model_id, use_fast=True, token=accesstoken) + tokenizer.add_special_tokens({'pad_token': '[PAD]'}) return model, tokenizer def generate(self, user_input: str, clear: bool = False) -> str: @@ -333,7 +349,7 @@ def generate(self, user_input: str, clear: bool = False) -> str: return_tensors="pt", ) inputs = inputs.to(self.device) - outputs = self.model.generate(input_ids=inputs, max_new_tokens=4096) + outputs = self.model.generate(input_ids=inputs, max_new_tokens=4096, pad_token_id=self.tokenizer.pad_token_id) response = self.tokenizer.decode( outputs[0][len(inputs[0]) : -1], skip_special_tokens=False ) diff --git a/openfasoc/generators/glayout/glayout/syntaxer/process_input.py b/openfasoc/generators/glayout/glayout/syntaxer/process_input.py index 8c20cf204..912d11a38 100644 --- a/openfasoc/generators/glayout/glayout/syntaxer/process_input.py +++ b/openfasoc/generators/glayout/glayout/syntaxer/process_input.py @@ -193,11 +193,14 @@ def process_param_or_var_sentence(self, text_input: str) -> bool: if word in ["called", "named"]: varname = words[i + 1] break + # check for a default value and remove it from varname + if "=" in varname: + varname = varname.split("=")[0] expr = None eqpar = text_input.replace("equal", "=").strip().removesuffix(".") expr = eqpar.split("=")[1] if "=" in eqpar else None if "parameter" in words: - self.code.update_parameter_table(varname, vartype, None, None) + self.code.update_parameter_table(varname, vartype, expr, None) else: # variable self.code.update_variable_table(varname, expr) return True diff --git a/openfasoc/generators/glayout/glayout/syntaxer/relational.py b/openfasoc/generators/glayout/glayout/syntaxer/relational.py index 4b5a3fa26..35e190163 100644 --- a/openfasoc/generators/glayout/glayout/syntaxer/relational.py +++ b/openfasoc/generators/glayout/glayout/syntaxer/relational.py @@ -312,7 +312,7 @@ def __init__(self, component_identifiers: list[str], component_name: str, module matching_files += list(glayout_path.rglob(str(component_name)+"_cell.py")) matching_files += list(glayout_path.rglob(str(component_name)+".convo")) # also check the test_cases directory for convo files - # matching_files += list((glayout_path / "../llm/syntax_data/convos").rglob(str(component_name)+".convo")) + matching_files += list((glayout_path / "../llm/syntax_data/convos").rglob(str(component_name)+".convo")) if len(matching_files)>0: module_path = matching_files[-1].resolve() else: From 03a0bba9f228e751fb9b1d91d7f37cd84b8c5ad3 Mon Sep 17 00:00:00 2001 From: Ali Hammoud <70279295+alibillalhammoud@users.noreply.github.com> Date: Sun, 9 Jun 2024 06:49:48 +0000 Subject: [PATCH 2/8] llm --- .../glayout/flow/routing/smart_route.py | 50 ++++++----- .../glayout/glayout/llm/manage_data.py | 10 ++- .../glayout/llm/rag_data/CommonSource.md | 15 +--- .../glayout/llm/rag_data/CurrentMirror.md | 10 +-- .../llm/rag_data/DeltaSigmaModulator.md | 2 + .../glayout/llm/rag_data/StrongArmLatch.md | 3 +- .../glayout/glayout/llm/rag_data/diffpair.md | 7 +- .../glayout/glayout/llm/rag_data/opamp.md | 13 +-- .../glayout/llm/rag_data/pushpullamp.md | 23 +---- .../glayout/glayout/llm/rag_data/resistor.md | 28 ------ .../glayout/llm/rag_data/ringoscillator.md | 41 --------- .../glayout/glayout/llm/rag_data/tia.md | 40 --------- .../glayout/llm/rag_data/voltagefollower.md | 50 ----------- .../llm/syntax_data/GlayoutStrictSyntax.md | 1 + .../CasecodeCommonGateCommonCentroid.convo | 6 ++ .../CurrentMirrorNtypeCommonCentroid.convo | 8 ++ .../syntax_data/convos/PTypeDiffPair.convo | 2 +- .../glayout/glayout/llm/syntax_data/eval.json | 3 +- .../llm/syntax_data/rephrase_train.json | 90 +++++++++++++------ .../glayout/llm/syntax_data/train.json | 12 ++- .../glayout/glayout/llm/train_and_run.py | 15 ++-- .../glayout/glayout/syntaxer/relational.py | 1 + 22 files changed, 143 insertions(+), 287 deletions(-) create mode 100644 openfasoc/generators/glayout/glayout/llm/rag_data/DeltaSigmaModulator.md delete mode 100644 openfasoc/generators/glayout/glayout/llm/rag_data/resistor.md delete mode 100644 openfasoc/generators/glayout/glayout/llm/rag_data/ringoscillator.md delete mode 100644 openfasoc/generators/glayout/glayout/llm/rag_data/tia.md delete mode 100644 openfasoc/generators/glayout/glayout/llm/rag_data/voltagefollower.md create mode 100644 openfasoc/generators/glayout/glayout/llm/syntax_data/convos/CasecodeCommonGateCommonCentroid.convo create mode 100644 openfasoc/generators/glayout/glayout/llm/syntax_data/convos/CurrentMirrorNtypeCommonCentroid.convo diff --git a/openfasoc/generators/glayout/glayout/flow/routing/smart_route.py b/openfasoc/generators/glayout/glayout/flow/routing/smart_route.py index 0443f89f9..e47c64b9f 100644 --- a/openfasoc/generators/glayout/glayout/flow/routing/smart_route.py +++ b/openfasoc/generators/glayout/glayout/flow/routing/smart_route.py @@ -264,48 +264,54 @@ def generic_route_ab_ba_common_centroid( # TODO: implement name1, name2 = parse_port_name(edge1.name), parse_port_name(edge2.name) width1 = edge1.width + # grab basename for reading ports + basename = edge1.name.rstrip("NESW").rstrip("_") + basename = basename.removesuffix("source").removesuffix("drain").removesuffix("gate").rstrip("_") + basename = basename.removesuffix("A").removesuffix("B") + def get_top_port(prtname): + return top_comp.ports[basename + prtname] # order names so that A is first (if only one A) if "A" in name2 and not("A" in name1): name1, name2 = name2, name1 # same device routes (A->A or B->B) (6/15) if check_route(name1,name2,"A_source","A_gate"): - return straight_route(pdk, top_comp.ports["A_source_E_private"],top_comp.ports["A_gate_route_con_N"],via2_alignment=("right","bottom")) + return straight_route(pdk, get_top_port("A_source_E_private"),get_top_port("A_gate_route_con_N"),via2_alignment=("right","bottom")) if check_route(name1,name2,"A_drain","A_gate"): - return straight_route(pdk, top_comp.ports["A_drain_E_private"],top_comp.ports["A_gate_route_con_N"],via2_alignment=("right","top")) + return straight_route(pdk, get_top_port("A_drain_E_private"),get_top_port("A_gate_route_con_N"),via2_alignment=("right","top")) if check_route(name1,name2,"A_source","A_drain"): - straight_route(pdk, top_comp.ports["br_multiplier_0_source_N"],top_comp.ports["br_multiplier_0_drain_S"],width=min(width1,1)) - return straight_route(pdk, top_comp.ports["tl_multiplier_0_source_S"],top_comp.ports["tl_multiplier_0_drain_N"],width=min(width1,1)) + straight_route(pdk, get_top_port("br_multiplier_0_source_N"),get_top_port("br_multiplier_0_drain_S"),width=min(width1,1)) + return straight_route(pdk, get_top_port("tl_multiplier_0_source_S"),get_top_port("tl_multiplier_0_drain_N"),width=min(width1,1)) if check_route(name1,name2,"B_source","B_gate"): - return straight_route(pdk, top_comp.ports["B_source_W_private"],top_comp.ports["B_gate_route_con_N"],via2_alignment=("left","bottom")) + return straight_route(pdk, get_top_port("B_source_W_private"),get_top_port("B_gate_route_con_N"),via2_alignment=("left","bottom")) if check_route(name1,name2,"B_drain","B_gate"): - return straight_route(pdk, top_comp.ports["B_drain_W_private"],top_comp.ports["B_gate_route_con_N"],via2_alignment=("left","top")) + return straight_route(pdk, get_top_port("B_drain_W_private"),get_top_port("B_gate_route_con_N"),via2_alignment=("left","top")) if check_route(name1,name2,"B_source","B_drain"): - top_comp << straight_route(pdk, top_comp.ports["tr_multiplier_0_source_S"],top_comp.ports["tr_multiplier_0_drain_N"],width=min(width1,1)) - return straight_route(pdk, top_comp.ports["bl_multiplier_0_source_N"],top_comp.ports["bl_multiplier_0_drain_S"],width=min(width1,1)) + top_comp << straight_route(pdk, get_top_port("tr_multiplier_0_source_S"),get_top_port("tr_multiplier_0_drain_N"),width=min(width1,1)) + return straight_route(pdk, get_top_port("bl_multiplier_0_source_N"),get_top_port("bl_multiplier_0_drain_S"),width=min(width1,1)) # A_src/drain->B_gate or B_src/drain->A_gate (4/15) if check_route(name1,name2,"A_source","B_gate"): - return straight_route(pdk, top_comp.ports["A_source_W_private"],top_comp.ports["B_gate_route_con_N"],via2_alignment=("left","top")) + return straight_route(pdk, get_top_port("A_source_W_private"),get_top_port("B_gate_route_con_N"),via2_alignment=("left","top")) if check_route(name1,name2,"A_drain","B_gate"): - return straight_route(pdk, top_comp.ports["A_drain_W_private"],top_comp.ports["B_gate_route_con_N"],via2_alignment=("left","bottom")) + return straight_route(pdk, get_top_port("A_drain_W_private"),get_top_port("B_gate_route_con_N"),via2_alignment=("left","bottom")) if check_route(name1,name2,"B_source","A_gate"): - return straight_route(pdk, top_comp.ports["B_source_E_private"],top_comp.ports["A_gate_route_con_N"],via2_alignment=("right","top")) + return straight_route(pdk, get_top_port("B_source_E_private"),get_top_port("A_gate_route_con_N"),via2_alignment=("right","top")) if check_route(name1,name2,"B_drain","A_gate"): - return straight_route(pdk, top_comp.ports["B_drain_E_private"],top_comp.ports["A_gate_route_con_N"],via2_alignment=("right","bottom")) + return straight_route(pdk, get_top_port("B_drain_E_private"),get_top_port("A_gate_route_con_N"),via2_alignment=("right","bottom")) # A_src/drain->B_src or A_src/drain->B_drain (4/15) if check_route(name1,name2,"A_source","B_source"): - return straight_route(pdk, top_comp.ports["tl_multiplier_0_source_E"],top_comp.ports["tr_multiplier_0_source_W"]) + return straight_route(pdk, get_top_port("tl_multiplier_0_source_E"),get_top_port("tr_multiplier_0_source_W")) if check_route(name1,name2,"A_drain","B_source"): - portmv1 = top_comp.ports["tl_multiplier_0_drain_E"].copy() - return straight_route(pdk, top_comp.ports["tl_multiplier_0_drain_E"],movex(portmv1,2*pdk.get_grule(pdk.layer_to_glayer(portmv1.layer))["min_separation"])) + portmv1 = get_top_port("tl_multiplier_0_drain_E").copy() + return straight_route(pdk, get_top_port("tl_multiplier_0_drain_E"),movex(portmv1,2*pdk.get_grule(pdk.layer_to_glayer(portmv1.layer))["min_separation"])) if check_route(name1,name2,"A_source","B_drain"): - portmv1 = top_comp.ports["tr_multiplier_0_drain_W"].copy() - return straight_route(pdk, top_comp.ports["tr_multiplier_0_drain_W"],movex(portmv1,-2*pdk.get_grule(pdk.layer_to_glayer(portmv1.layer))["min_separation"])) + portmv1 = get_top_port("tr_multiplier_0_drain_W").copy() + return straight_route(pdk, get_top_port("tr_multiplier_0_drain_W"),movex(portmv1,-2*pdk.get_grule(pdk.layer_to_glayer(portmv1.layer))["min_separation"])) if check_route(name1,name2,"A_drain","B_drain"): - portmv1 = top_comp.ports["bl_mutliplier_0_drain_N"].copy() - portmv2 = top_comp.ports["br_multiplier_0_drain_N"].copy() - top_comp << straight_route(pdk, movex(portmv1,-portmv1.width/2), top_comp.ports["tl_multiplier_0_drain_S"],width=width1) - return straight_route(pdk, movex(portmv2,portmv2.width/2),top_comp.ports["tr_multiplier_0_drain_S"]) + portmv1 = get_top_port("bl_mutliplier_0_drain_N").copy() + portmv2 = get_top_port("br_multiplier_0_drain_N").copy() + top_comp << straight_route(pdk, movex(portmv1,-portmv1.width/2), get_top_port("tl_multiplier_0_drain_S"),width=width1) + return straight_route(pdk, movex(portmv2,portmv2.width/2),get_top_port("tr_multiplier_0_drain_S")) # A_gate -> B_gate (1/15) if check_route(name1,name2,"A_gate","B_gate"): - return straight_route(pdk,top_comp.ports["br_multiplier_0_gate_W"],top_comp.ports["bl_multiplier_0_gate_E"]) + return straight_route(pdk,get_top_port("br_multiplier_0_gate_W"),get_top_port("bl_multiplier_0_gate_E")) raise ValueError("You picked a port that smart_route with ab_ba_common_centroid does not support") diff --git a/openfasoc/generators/glayout/glayout/llm/manage_data.py b/openfasoc/generators/glayout/glayout/llm/manage_data.py index 9c8e40c0d..a8bcfe5f3 100644 --- a/openfasoc/generators/glayout/glayout/llm/manage_data.py +++ b/openfasoc/generators/glayout/glayout/llm/manage_data.py @@ -217,9 +217,9 @@ def get_prompt_from_template( inst_prompt += f"Below is some context on Glayout strictsyntax:\n{glayout_nlp_context}\n\n" #inst_prompt += "Below is context on the circuit" #inst_prompt += "convert an example prompt to Glayout strictsyntax\n" - #inst_prompt += f"{ragcontext}\n\n----\nTRANSLATION TASK\n" + inst_prompt += f"\n{ragcontext}\n" #inst_prompt += f"Do NOT include the context in your response. Convert the following prompt to Glayout strictsyntax:\n{prompt}" - inst_prompt += f"Glayout strictsyntax is a electronic circuit layout command language. Convert the following prompt to Glayout strictsyntax:\n{prompt}" + inst_prompt += f"Convert the following prompt to Glayout strictsyntax:\n{prompt}" # unify prompt and return messages = [{"role": "user", "content": inst_prompt}] # conditionally add label (expected strict syntax output) @@ -268,12 +268,14 @@ def load_preprocessed_data_in_messages_format(): # train train_messages = list() for prompt, result in train_examples: - train_messages.append(get_prompt_from_template(None,None,prompt,result,True)) + ragcontext = RAGvecdb.query(prompt, 1) + train_messages.append(get_prompt_from_template(None,ragcontext,prompt,result,True)) train_data = Dataset.from_dict({"messages":train_messages}) # eval eval_messages = list() for prompt, result in eval_examples: - eval_messages.append(get_prompt_from_template(None,None,prompt,result,True)) + ragcontext = RAGvecdb.query(prompt, 1) + eval_messages.append(get_prompt_from_template(None,ragcontext,prompt,result,True)) eval_data = Dataset.from_dict({"messages":eval_messages}) return {"train": train_data, "evaluation": eval_data} diff --git a/openfasoc/generators/glayout/glayout/llm/rag_data/CommonSource.md b/openfasoc/generators/glayout/glayout/llm/rag_data/CommonSource.md index 4d12fe1fd..a0a354842 100644 --- a/openfasoc/generators/glayout/glayout/llm/rag_data/CommonSource.md +++ b/openfasoc/generators/glayout/glayout/llm/rag_data/CommonSource.md @@ -1,15 +1,2 @@ -# Common Source Amplifier -The common source amplifier, serves as an amplifier with voltage gain and phase inversion. -The main amplifying transistor is in a common-source configuration. Its source is connected to a common reference (often ground), its gate receives the input signal, and the drain is connected to the active load. +# Common Source Amplifier There are two MOSFETs. One acts as the amplifying stage and we will call this M1, and the other is the active load which we will call M2. Depending on the type of active load, the port of the active load corresponding to the direction of current is connected to the drain of M1. The source of M1 is connected to a lower voltage level than the supply. -Pseudo Netlist: -an nmos is has the following subckt definition: -NMOS drain gate source body -a pmos is has the following subckt definition: -PMOS drain gate source body - -a common source amplifier with a biased pfet transistor has the following subckt definition: -.subckt commonsourceamp vin vbias vdd vss vout -m1 vout vin vss vss NMOS -m2 vout vbias vdd vdd PMOS -.endsubckt diff --git a/openfasoc/generators/glayout/glayout/llm/rag_data/CurrentMirror.md b/openfasoc/generators/glayout/glayout/llm/rag_data/CurrentMirror.md index 785621f87..f9336a517 100644 --- a/openfasoc/generators/glayout/glayout/llm/rag_data/CurrentMirror.md +++ b/openfasoc/generators/glayout/glayout/llm/rag_data/CurrentMirror.md @@ -1,12 +1,4 @@ # Current Mirror A current mirror is a circuit designed to copy a current The ratio is the width ratio between mirror and reference, used to tune the relative current between mirror transistor drain and reference transistor drain. -two transistors (either nfet or pfet) one labeled as the reference which accepts an input current at the drain, and one labeled as mirror which has the output current at the drain. The sources of reference and mirror are connected and the gates of reference and mirror are also connected. The drain of the reference is connected to gate of reference. -Pseudo Netlist: -an nmos is has the following subckt definition: -NMOS drain gate source body -the nfet current mirror has the following subckt definition: -.subckt currentmirror inputcurrent outputcurrent -reference inputcurrent inputcurrent gnd gnd NMOS -mirror outputcurrent inputcurrent gnd gnd NMOS -.endsubckt \ No newline at end of file +two transistors (either nfet or pfet) one labeled as the reference which accepts an input current at the drain, and one labeled as mirror which has the output current at the drain. The sources of reference and mirror are connected and the gates of reference and mirror are also connected. The drain of the reference is connected to gate of reference. \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/llm/rag_data/DeltaSigmaModulator.md b/openfasoc/generators/glayout/glayout/llm/rag_data/DeltaSigmaModulator.md new file mode 100644 index 000000000..4d8a45aa1 --- /dev/null +++ b/openfasoc/generators/glayout/glayout/llm/rag_data/DeltaSigmaModulator.md @@ -0,0 +1,2 @@ +# Delta Sigma Modulator ADC +A delta sigma modulator is a circuit consisting of several existing components including an opamp and a latched comparator. The latched compartor includes a d flip flop and a strong arm latch. All these components can be directly imported. The outputs of the opamp should be connected to the inputs of the latched comparator. \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/llm/rag_data/StrongArmLatch.md b/openfasoc/generators/glayout/glayout/llm/rag_data/StrongArmLatch.md index 366dc1703..b1ed63e08 100644 --- a/openfasoc/generators/glayout/glayout/llm/rag_data/StrongArmLatch.md +++ b/openfasoc/generators/glayout/glayout/llm/rag_data/StrongArmLatch.md @@ -1,3 +1,2 @@ # Strong Arm Latch -A strong arm latch is a comparator (which means it compares two input voltages). If one voltage is higher it outputs a high voltage and if one of them is lower then it output a low voltage. -A strong arm latch consists of a diffpair. The inputs of the diffpair are the inputs of the strong arm latch. The diff pair outputs are connected to a cross coupled inverter..... drain. There are 2 pfets for... \ No newline at end of file +A strong arm latch consists of a diffpair, a CrossCoupleInverters, a bridge nfet, a clkgnd nfet, and two pfets clkpwrL (west) and clkpwrR (east). The cross coupled inverters should be at the top. The bridge should be above the diffpair but below the cross coupled inverters. The clkgnd should be at the bottom, and both clkpwr transistors should be left and right of the cross coupled inverters. You must route the drain of transistor A of the diffpair with the drain of the bridge, the drain of transistor B of the diffpair with the source of the bridge, the source of transistor A in the diffpair with the source of clkgnd. \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/llm/rag_data/diffpair.md b/openfasoc/generators/glayout/glayout/llm/rag_data/diffpair.md index ffe2c3cfa..5036571d6 100644 --- a/openfasoc/generators/glayout/glayout/llm/rag_data/diffpair.md +++ b/openfasoc/generators/glayout/glayout/llm/rag_data/diffpair.md @@ -8,9 +8,6 @@ width: a float parameter specifying the width of all transistor Components part fingers: an integer parameter which modifies the number of fingers in all transistor Components which are part of the diff pair. ## Ports The following are just some examples of the valid ports for diff_pair: -ComponentRef_A_source_S -ComponentRef_A_drain_N -ComponentRef_B_source_S -ComponentRef_A_gate_E +ComponentRef_A_source_E ComponentRef_B_drain_W -ComponentRef_B_gate_E +ComponentRef_A_gate_E diff --git a/openfasoc/generators/glayout/glayout/llm/rag_data/opamp.md b/openfasoc/generators/glayout/glayout/llm/rag_data/opamp.md index 9b64abcda..1cd554fb6 100644 --- a/openfasoc/generators/glayout/glayout/llm/rag_data/opamp.md +++ b/openfasoc/generators/glayout/glayout/llm/rag_data/opamp.md @@ -1,13 +1,2 @@ # Opamp -An operational amplifier or opamp is a voltage amplifying device. -## Terms Defined -Inverting Input (IN-): The input terminal where the signal is inversely amplified.
-Non-inverting Input (IN+): The input terminal where the signal is amplified retaining its original phase.
-Output Terminal: Where the amplified signal is provided.
-Power Supply Ports: Two ports, one for the positive power supply voltage (V+), and one for the negative (V-).
-Bias Current: The current that flows into the input terminals due to internal transistor biasing.
-Open-Loop Gain: The amplification factor of the operational amplifier without any feedback.
-Slew Rate: The maximum rate at which the output voltage can change, often specified in V/µs.
-Offset Voltage: A small voltage that must be applied between the input terminals to ensure a zero volt output without any signal. -### In Words -The op amp symbol consists of a triangle pointing to the right with five terminals: two input terminals on the left side, one output terminal on the triangle's right tip, and two power supply terminals (-V and +V) at the top and bottom respectively. The non-inverting input (IN+) is usually shown at the top left of the triangle, and the inverting input (IN-) is depicted below it. \ No newline at end of file +An operational amplifier or opamp is a voltage amplifying device. A 4 stage opamp consists of several integrator stages. \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/llm/rag_data/pushpullamp.md b/openfasoc/generators/glayout/glayout/llm/rag_data/pushpullamp.md index 208f25f65..9af29f92d 100644 --- a/openfasoc/generators/glayout/glayout/llm/rag_data/pushpullamp.md +++ b/openfasoc/generators/glayout/glayout/llm/rag_data/pushpullamp.md @@ -1,23 +1,2 @@ # Push Pull Amp (Class B Amplifier) -A push-pull amplifier is a type of amplifier which is able to - -## Terms Defined - -Class: The amplifier class, such as Class A, B, AB, or C, indicating the portion of the input signal cycle during which each transistor conducts. -Active Device: The amplifying element, often a transistor, that can control a large current flow with a smaller input signal. -Biasing: The process of setting the initial operating point of an active device. -Crossover Distortion: A form of distortion that occurs in Class B and AB push-pull amplifiers due to the transition between the "push" and "pull" transistors. - -## Schematic - -### In Words - -A push-pull amplifier typically consists of two transistors, an NPN (or N-channel MOSFET) and a PNP (or P-channel MOSFET) transistor. The emitters (or sources) of the two transistors are connected together and to the output load. The bases (or gates) receive the input signal through a phase splitter, which creates two signals that are 180 degrees out of phase with each other. The collectors (or drains) of each transistor are connected to the supply voltages. - -### Pseudo Netlist - -A push pull amp has the following subckt definition: .subckt pushpullamp input output vcc vee -Q1 NPN_collector input common vcc NPN -Q2 PNP_collector input common vee PNP -.endsubckt - +A push-pull amplifier typically consists of two transistors, a nmos and pmos. The sources of the two transistors are connected together and to the output load. The drains of each transistor are connected to the supply voltages. \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/llm/rag_data/resistor.md b/openfasoc/generators/glayout/glayout/llm/rag_data/resistor.md deleted file mode 100644 index 93fd47720..000000000 --- a/openfasoc/generators/glayout/glayout/llm/rag_data/resistor.md +++ /dev/null @@ -1,28 +0,0 @@ -# Resistor - -## Purpose - -A resistor is a passive electrical component that provides electrical resistance in an electronic circuit. The main purpose of a resistor is to limit electrical current, divide voltages, and dissipate power as heat. They are essential in creating specific voltage or current relationships in circuits, adjusting signal levels, biasing active elements, and terminating transmission lines, among many other applications. - -## Ohm's Law - -The fundamental characteristic of a resistor is described by Ohm's Law, which states that the current (I) through a conductor between two points is directly proportional to the voltage (V) across the two points and inversely proportional to the resistance (R) of the conductor: - -$[ V = I \times R ]$ - -## Construction and Characteristics - -Resistors can be constructed from various materials, such as carbon, metal film, or wires wound around a core. They are specified by resistance value, power rating, tolerance, temperature coefficient, and stability. The resistance value determines how much it will oppose current flow, while the power rating specifies the maximum power it can dissipate without damage. -Schematic Symbol - -The schematic symbol for a resistor is typically a zigzag line with two protruding terminals representing the points of electrical connection. European schematics sometimes use a simple rectangle instead of the zigzag symbol. - - -## Performance Specifications - -Resistance: The main parameter of a resistor, typically measured in ohms (Ω).
-Tolerance: Indicates how much the actual resistance can vary from the specified value, often given as a percentage (e.g., ±1%, ±5%).
-Power Rating: The maximum power, usually in watts (W), that a resistor can safely dissipate as heat.
-Temperature Coefficient: Describes how the resistance changes with temperature, important for precision applications. - -Resistors are reliable, economical, and widely available components that remain integral to nearly every electronic circuit. Whether used singly or in networks, resistors shape the behavior of circuits in predictable and controllable ways. diff --git a/openfasoc/generators/glayout/glayout/llm/rag_data/ringoscillator.md b/openfasoc/generators/glayout/glayout/llm/rag_data/ringoscillator.md deleted file mode 100644 index 4159db158..000000000 --- a/openfasoc/generators/glayout/glayout/llm/rag_data/ringoscillator.md +++ /dev/null @@ -1,41 +0,0 @@ -# Ring Oscillator - -## Purpose - -A ring oscillator is a type of electronic oscillator that produces a periodic oscillating electronic signal (often a square wave). It consists of an odd number of NOT gates or inverters whose output is connected back to the input, forming a closed loop. The main purpose of the ring oscillator is to generate a high-frequency clock signal and for use in integrated circuits as a timing element. It's also frequently used in characterizing and testing the properties of semiconductor technologies, such as propagation delay and signal integrity. - -## Terms Defined - -Inverter: A logic gate that outputs the complement (opposite) of its input signal.
-Propagation Delay (t_pd): The time delay it takes for a signal to pass through one stage of the circuit, such as an inverter.
-Frequency (f): The frequency of oscillation, determined by the number of inverters and the propagation delay. - -## Theory - -The operation of a ring oscillator is based on the propagation delay inherent in the inverters. When the loop is closed, an initial change in voltage at the first inverter's input propagates through each inverter in the chain. Since an odd number of inverters are used, the output of the last inverter is an inverted version of the original signal, which becomes the input to the first inverter, perpetuating the oscillation. The frequency of oscillation is inversely proportional to the total propagation delay through the loop (the sum of the delay through each inverter and any delay from wiring) and can be estimated by: - -$[ f = \frac{1}{t_{pd} \times N} ]$ - -where $( t_{pd} )$ is the individual delay for one inverter and ( N ) is the number of inverters. - -## Schematic - -### Described in Words - -A ring oscillator circuit uses an odd number of inverters connected in series. The output of the last inverter is fed back to the input of the first, creating a feedback loop. - -### Pseudo Netlist - -A pseudo netlist of a ring oscillator can be written as:.subckt ringoscillator out X1 out net1 INV X2 net1 net2 INV ... XN net(N-1) out INV .endsubckt - -In this netlist, X1...XN denote individual inverters, net1...net(N-1) represent internal connections between inverters, and INV stands for the inverter model. - -## Performance Specifications - -Performance characteristics of a ring oscillator include: - -Frequency Stability: Often limited due to sensitivity to supply voltage variations and temperature changes.
-Power Consumption: Related to the number of stages and the frequency of operation, with higher frequencies generally leading to higher power usage.
-Phase Noise: The short-term frequency stability of the oscillator, affected by the quality of the inverters and the supply noise. - - diff --git a/openfasoc/generators/glayout/glayout/llm/rag_data/tia.md b/openfasoc/generators/glayout/glayout/llm/rag_data/tia.md deleted file mode 100644 index bea41570b..000000000 --- a/openfasoc/generators/glayout/glayout/llm/rag_data/tia.md +++ /dev/null @@ -1,40 +0,0 @@ -# Transimpedance Amplifier (TIA) - -## Purpose - -A Transimpedance Amplifier (TIA) is an amplifier that converts an input current to a proportional output voltage. The primary role of a TIA is in applications where current signals need to be detected or measured, and amplified into a more usable voltage level. Commonly, TIAs are used with photodiodes, photomultiplier tubes, or other sensors that produce a current proportional to the intensity of light they receive. - -## Terms Defined - -Photodiode: A semiconductor device that generates a current when exposed to light.
-Feedback Resistor $(R_f)$: The resistor in the feedback loop of the TIA that sets the gain of the amplifier.
-Transimpedance Gain: The ratio of the output voltage to the input current, given in ohms, which is numerically equal to the value of the feedback resistor (R_f). - -## Theory - -The TIA uses a feedback resistor to set the gain of the amplifier and convert a small input current (I_in) from a sensor or photodiode to a larger output voltage (V_out). Ohm’s law describes the relationship between the input current and the output voltage of a TIA: $V_out = I_in * R_f$. Because the input is current and the output is voltage, the transimpedance gain has units of resistance, which is what gives the TIA its name. In an ideal TIA, the input impedance is close to zero, which ensures that the current flows through the amplifier, and the output impedance is low. - -## Schematic - -### Described in Words - -In the schematic of a TIA, an op-amp is configured with the photodiode connected between its inverting input and the ground, effectively reverse-biasing the photodiode when the op-amp output swings positive. The non-inverting input is connected to a reference voltage, often ground. A feedback resistor is connected between the op-amp's output and its inverting input. - -### Pseudo Netlist - -An operational amplifier has the following subckt definition: .subckt opamp inverting_input non_inverting_input output v_positive v_negative - -A pseudo netlist of a tia can be written as: -.subckt tia pd_in v_out v_ref XU1 op_out pd_in v_ref opamp Rf op_out pd_in .endsubckt - -In this netlist, XU1 represents the operational amplifier, pd_in is the input from the photodiode, v_out is the output voltage of the TIA, and v_ref is the reference voltage for the non-inverting input. Rf is the feedback resistor which sets the gain of the TIA. - -## Performance Specifications - -Important specifications for a TIA include: - -Bandwidth: The range of frequencies over which the TIA will have a consistent gain. This is often affected by the feedback resistor and any parasitic capacitance at the input.
-Noise Performance: Critical for the sensitivity of the TIA as it amplifies the signal from the photodiode. Includes contributions from the feedback resistor, the op-amp, and the diode itself.
-Dynamic Range: The range of input currents over which the TIA can provide a linear output voltage response.
-Stability: Factors such as the capacitance of the photodiode and the value of Rf can affect the stability and may lead to oscillations if not properly compensated. - diff --git a/openfasoc/generators/glayout/glayout/llm/rag_data/voltagefollower.md b/openfasoc/generators/glayout/glayout/llm/rag_data/voltagefollower.md deleted file mode 100644 index 91ac5efe5..000000000 --- a/openfasoc/generators/glayout/glayout/llm/rag_data/voltagefollower.md +++ /dev/null @@ -1,50 +0,0 @@ -# Voltage Follower - -## Purpose - -A voltage follower, also known as a buffer amplifier, is a circuit configuration where the output voltage directly follows the input voltage. This means the output voltage is the same as the input voltage. The primary purpose of a voltage follower is to increase the input impedance (ideally to infinity) and decrease the output impedance (ideally to zero), thus providing no voltage gain but significant current gain. This allows the voltage follower to serve as a buffer, isolating the source from the load while preventing signal attenuation that would occur if the load were directly connected to the source. - -## Terms Defined - -Anode: The terminal through which conventional current flows into the diode, typically marked with a plus sign. -Cathode: The terminal through which conventional current flows out of the diode, often denoted with a line or band on the diode body. -Forward Bias: A condition where the anode is more positive relative to the cathode, allowing current flow. -Reverse Bias: A condition where the cathode is more positive in relation to the anode, restricting current flow. -Forward Voltage Drop (Vf): The potential difference across the diode terminals when current is conducted in the forward direction, typically 0.7V for silicon diodes and 0.3V for germanium diodes. -Reverse Breakdown Voltage (V_br): The voltage at which the diode will conduct a significant reverse current, potentially leading to device damage if sustained. - -## Theory - -The voltage follower is realized using an operational amplifier (op-amp) with 100% negative feedback provided by a direct connection from the output terminal back to the inverting input. There is no external feedback network of resistors or capacitors, simplifying the configuration. - -## Schematic - -### In Words - -In the schematic for a voltage follower: - -The positive (+) terminal of the op-amp is the non-inverting input. -The negative (−) terminal of the op-amp, the inverting input, is connected directly to the output terminal of the op-amp. -The input voltage is applied to the non-inverting input (+). -The output is taken from the output terminal of the op-amp. - - -### Pseudo Netlist - -An operational amplifier has the following subckt definition: .subckt opamp inverting_input non_inverting_input output v_positive v_negative - -A voltage follower has the following subckt definition: .subckt voltagefollower in out opamp_model X1 in out out opamp_model .endsubckt - -X1 represents the operational amplifier with the in net connected to the non-inverting input, the out net connected to both the inverting input and the output, with opamp_model defining the operational amplifier’s characteristics. - -## Performance Specifications - -Key specifications for a voltage follower include: - -Input Impedance (Z_in): Ideally infinite, which means no current is drawn from the input source.
-Output Impedance (Z_out): Ideally zero, which allows the circuit to drive heavy loads without significant voltage drop.
-Voltage Gain (A_v): Unity (1), meaning the output voltage equals the input voltage without amplification.
-Bandwidth: Broad, often limited only by the op-amp’s characteristics since no reactive components are introduced.
-Slew Rate: This defines the maximum rate at which the output can change and can be a limiting factor in high-frequency applications. - -Voltage followers are widely used in circuits where signal isolation is needed without altering the signal voltage, such as interfacing between high and low impedance circuit blocks or driving capacitive loads without stability issues. \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/llm/syntax_data/GlayoutStrictSyntax.md b/openfasoc/generators/glayout/glayout/llm/syntax_data/GlayoutStrictSyntax.md index ecc70ceed..84faf17b8 100644 --- a/openfasoc/generators/glayout/glayout/llm/syntax_data/GlayoutStrictSyntax.md +++ b/openfasoc/generators/glayout/glayout/llm/syntax_data/GlayoutStrictSyntax.md @@ -131,3 +131,4 @@ Where top refers to the inverter’s pmos Component and bottom refers to the inv ## StrictSyntax Style Guide You should always follow this order of commands when creating a Component with strictsyntax: Start by importing any required Components, then create any required parameters, then place all required ComponentRefs with their respective parameters, then move all ComponentRefs to their final positions relative to one another, and lastly route between ComponentRefs. +Do not place components overlapping (always move components if more than one is placed) \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/CasecodeCommonGateCommonCentroid.convo b/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/CasecodeCommonGateCommonCentroid.convo new file mode 100644 index 000000000..00425523d --- /dev/null +++ b/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/CasecodeCommonGateCommonCentroid.convo @@ -0,0 +1,6 @@ +CascodeCommonGateCommonCentroid +create a float parameter called width +create a float parameter called length +create a int parameter called fingers +place a common centroid pair called ccg with width=width, length=length, fingers=fingers +route between ccg_A_source_W and ccg_B_drain_W using smart_route diff --git a/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/CurrentMirrorNtypeCommonCentroid.convo b/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/CurrentMirrorNtypeCommonCentroid.convo new file mode 100644 index 000000000..02f609106 --- /dev/null +++ b/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/CurrentMirrorNtypeCommonCentroid.convo @@ -0,0 +1,8 @@ +CurrentMirrorNtypeCommonCentroid +create a float parameter called width +create a float parameter called length +create a int parameter called fingers +place a common centroid pair called cmirror with width=width, length=length, fingers=fingers +route between cmirror_A_source_E and cmirror_B_source_E +route between cmirror_A_drain_E and cmirror_B_gate_E +route between cmirror_A_gate_E and cmirror_B_gate_E \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/PTypeDiffPair.convo b/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/PTypeDiffPair.convo index c4e17de0b..c007a4349 100644 --- a/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/PTypeDiffPair.convo +++ b/openfasoc/generators/glayout/glayout/llm/syntax_data/convos/PTypeDiffPair.convo @@ -10,4 +10,4 @@ create a int parameter called vin2_fingers place a pmos called vin1 with width=vin1_width, length=vin1_length, fingers=vin1_fingers, rmult=1, multipliers=vin1_multiplier, with_substrate_tap=False, with_tie=True, with_dummy=True place a pmos called vin2 with width=vin2_width, length=vin2_length, fingers=vin2_fingers, rmult=1, multipliers=vin2_multiplier, with_substrate_tap=False, with_tie=True, with_dummy=True move vin1 to the left of vin2 -route between vin1_source_N and vin2_source_N using smart_route \ No newline at end of file +route between vin1_source_E and vin2_source_W using smart_route \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/llm/syntax_data/eval.json b/openfasoc/generators/glayout/glayout/llm/syntax_data/eval.json index 93dcba856..a9915e62b 100644 --- a/openfasoc/generators/glayout/glayout/llm/syntax_data/eval.json +++ b/openfasoc/generators/glayout/glayout/llm/syntax_data/eval.json @@ -18,7 +18,7 @@ }, { "NLPfilename": "IntegratorStage.convo", - "LLMprompt": "Create an integrator stage. This can be made with two pairs of pfets and a pair of nfets. The first pair of pfets is a current mirror that is connected to a pfet diff pair. This is then connected to an active load. These components are arranged top to bottom respectively. Parametrize everything" + "LLMprompt": "Create an integrator stage. This can be made with two pairs of pfets and a pair of nfets. The first pair of pfets is a current mirror that is connected to a pfet diff pair. This is then connected to an active load. Parametrize everything" }, { "NLPfilename": "DeltaSigmaModulator", @@ -28,6 +28,5 @@ "NLPfilename": "NtypeCurrentMirror", "LLMprompt": "Make a current mirror using common centroid technique." } - ] } \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/llm/syntax_data/rephrase_train.json b/openfasoc/generators/glayout/glayout/llm/syntax_data/rephrase_train.json index 17d59a2f6..0f7343043 100644 --- a/openfasoc/generators/glayout/glayout/llm/syntax_data/rephrase_train.json +++ b/openfasoc/generators/glayout/glayout/llm/syntax_data/rephrase_train.json @@ -2,103 +2,143 @@ "data": [ { "NLPfilename": "BiasVoltageGenerator", - "LLMprompt": "A generic BiasVoltageGenerator includes a source pmos and a load nmos. Position the load below the source. Connect the drains of both transistors and the load gate. Link the source gate to the load source." + "LLMprompt": "Design a BiasVoltageGenerator with a source PMOS and a load NMOS. Position the load below the source. Short the drains of both transistors and the load gate. Connect the source gate and load source." }, { "NLPfilename": "CrossCoupledInverters", - "LLMprompt": "Cross-coupled inverters consist of two inverters where the output of one serves as the input for the other. Use the interdigitated placement macro to match the pfet and nfet of both inverters." + "LLMprompt": "Cross-coupled inverters consist of two inverters, where the output of one is the input of the other. Use interdigitated placement to match the PFET and NFET of both inverters." }, { "NLPfilename": "DiffPair", - "LLMprompt": "Design an nfet differential pair by placing two nfets side by side and routing their sources, without employing any matching techniques." + "LLMprompt": "Create an NFET differential pair without using any matching techniques. Place two NFETs side by side and connect their sources." }, { "NLPfilename": "SourceFollow", - "LLMprompt": "Create an n-type source follower with the amplifier named srcfoll and the load named isrc. Position the load below the amplifier and route the load source to the amplifier drain. Avoid using any matching techniques." + "LLMprompt": "Design an N-type source follower with the amplifier named 'srcfoll' and the load named 'isrc'. Place the load below the amplifier and route the load source to the amplifier drain without using any matching techniques." }, { "NLPfilename": "CascodeCommonGate", - "LLMprompt": "A cascode common gate stage involves two nfets: an input nfet and an output nfet. Connect the source of the input to the drain of the output. Position the output above the input without using any matching techniques." + "LLMprompt": "Design a cascode common gate stage with two NFETs: an input NFET and an output NFET. Connect the source of the input to the drain of the output. Place the output above the input and parametrize everything without using any matching techniques." }, { "NLPfilename": "CTATVGen", - "LLMprompt": "A CTAT (complementary to absolute temperature) voltage generator includes a pair of nmos transistors: a source and a load. Connect the drain of the source to the load's source. Avoid matching techniques and place the source above the load." + "LLMprompt": "Design a CTAT voltage generator with a pair of NMOS transistors: one source and one load. Connect the drain of the source to the source of the load. Place the source above the load and parametrize everything without using any matching techniques." }, { "NLPfilename": "Inverter", - "LLMprompt": "An inverter comprises a pmos for pull-up and an nmos for pull-down, with their drains forming the output node and their gates forming the input node. Typically, the pfet is placed above the nfet." + "LLMprompt": "Design an inverter with a PMOS for pull-up and an NMOS for pull-down. Connect their drains to form the output node and their gates to form the input node. Place the PFET above the NFET and parametrize everything." }, { "NLPfilename": "CascodeCommonSource", - "LLMprompt": "A cascode common source configuration includes an input nmos and a bias nfet stacked above each other, with the input at the bottom. Connect the bias source to the input drain." + "LLMprompt": "Design a cascode common source stage with an input NMOS and a bias NFET stacked above each other, with the input at the bottom. Connect the bias source to the input drain and parametrize everything." }, { "NLPfilename": "CurrentMirrorNtype", - "LLMprompt": "An n-type current mirror consists of two nmos transistors: a reference and a mirror. Place them side by side, connecting their gates and sources together. Connect the drain and gate of the mirror transistor. Do not use special placement techniques." + "LLMprompt": "Design an N-type current mirror with two NMOS transistors: a reference and a mirror. Place them side by side, connecting the gates and sources together. Connect the drain and gate of the mirror transistor. Parametrize everything without using special placement techniques." }, { "NLPfilename": "LowNoiseAmp", - "LLMprompt": "A low noise amplifier configuration includes two nfets: one for input and one for gain. The gain source and input gate form the input node, while the input source and gain drain form the output node." + "LLMprompt": "Design a low noise amplifier with two NFETs: one for input and one for gain. Connect the gain source and input gate to form the input node, and the input source and gain drain to form the output node without using any special placement strategies." }, { "NLPfilename": "ULPD", - "LLMprompt": "An ultra low power diode is constructed using two nfet transistors: one named forward and the other named leakagered. Place the forward transistor on top. Connect the gate to the source for both transistors without any matching." + "LLMprompt": "Design an ultra low power diode with two NFET transistors: one named 'forward' and the other 'leakagered'. Place 'forward' on top and route the gate to the source of both transistors without using any matching techniques." }, { "NLPfilename": "ClassBPushPull", - "LLMprompt": "Design a class B push-pull amplifier with an nfet named supply and a pfet named absorb. Connect the sources together and the gates together, without using matching techniques." + "LLMprompt": "Design a class B push-pull amplifier with an NFET named 'supply' and a PFET named 'absorb'. Parametrize everything, route the sources together, and route the gates together without using any matching techniques." }, { "NLPfilename": "CurrentMirrorNtypeInterdigitated", - "LLMprompt": "Use interdigitated matching to create an n-type current mirror. Parametrize the width, length, and number of fingers." + "LLMprompt": "Design an N-type current mirror using interdigitated placement. Parametrize width, length, and fingers." }, { "NLPfilename": "NAND", - "LLMprompt": "A NAND gate is a digital circuit with two pull-up and two pull-down transistors. The pull-up transistors are in parallel, and the pull-down transistors are in series. Place the pull-up network above the pull-down network without using matching techniques." + "LLMprompt": "Design a NAND gate with two pull-up and two pull-down transistors. Place the pull-up transistors in parallel and the pull-down transistors in series. Place the pull-up network above the pull-down network without using any matching techniques." }, { "NLPfilename": "Varactor", - "LLMprompt": "Varactors are variable capacitors. To create one, place two nmos transistors named control and accumulation. Connect their sources together and their drains together. Connect the control source to the accumulation drain." + "LLMprompt": "Design a varactor with two NMOS transistors named 'control' and 'accumulation'. Short the sources and drains, and connect the control source to the accumulation drain." }, { "NLPfilename": "CommonSourceAmplifier", - "LLMprompt": "A common source amplifier includes an input nmos and a bias pmos, with the input at the bottom. Route the input drain to the bias source." + "LLMprompt": "Design a common source amplifier with an input NMOS and a bias PMOS. Place the input at the bottom and route the input drain to the bias source." }, { "NLPfilename": "CurrentMirrorPtype", - "LLMprompt": "Create a current mirror using pmos transistors. Avoid matching techniques. Parametrize all components." + "LLMprompt": "Design a current mirror using PMOS transistors. Parametrize everything without using any matching techniques." }, { "NLPfilename": "NoiseXDiffConv", - "LLMprompt": "A NoiseXDiffConv circuit consists of two nfet transistors placed one above the other, with the gate of one connected to the drain of the other." + "LLMprompt": "Design a NoiseXDiffConv circuit with two NFET transistors, one below the other, with the gate of one connected to the drain of the other." }, { "NLPfilename": "VoltageFollower", - "LLMprompt": "A voltage follower includes a transconductance enhancement nfet (tet) and a gate-source capacitance nfet (gsc). Connect the source of tet to the drain of gsc and the drain of tet to the gate of gsc without using special placement strategies." + "LLMprompt": "Design a voltage follower with a transconductance enhancement NFET (tet) and a gate-source capacitance NFET (gsc). Route the source of tet to the drain of gsc and the drain of tet to the gate of gsc without using special placement strategies." }, { "NLPfilename": "CommonSourceAmplifierFoldedDiodeLoad", - "LLMprompt": "A common source amplifier with a folded diode load uses nfet transistors, where the bias transistor is replaced with a diode-connected transistor. Route the gate and drain of the diode and short the drains and sources without special placement techniques." + "LLMprompt": "Design a common source amplifier with a folded diode load using NFET transistors. Replace the bias transistor with a diode-connected transistor. Route the gate and drain of the diode and short the drains and sources without using special placement techniques." }, { "NLPfilename": "CurrentMirrorPtypeInterdigitated", - "LLMprompt": "Use interdigitated matching to create a p-type current mirror. Parametrize the width, length, and number of fingers." + "LLMprompt": "Design a P-type current mirror using interdigitated matching. Parametrize width, length, and fingers." }, { "NLPfilename": "NOR", - "LLMprompt": "A NOR gate is a digital circuit with two pull-up and two pull-down transistors. The pull-up transistors are in series, and the pull-down transistors are in parallel. Place the pull-up network above the pull-down network without using matching techniques." + "LLMprompt": "Design a NOR gate with two pull-up and two pull-down transistors. Place the pull-up transistors in series and the pull-down transistors in parallel. Place the pull-up network above the pull-down network without using any matching techniques." }, { "NLPfilename": "CommonSourceAmplifierWDiodeLoad", - "LLMprompt": "A high-speed common source amplifier with a diode load is called a wideband amplifier. Short the source of the input transistor and the diode drain, as well as the diode gate and diode drain." + "LLMprompt": "Design a high-speed common source amplifier with a diode load using NFET transistors. Short the source of the input transistor and the diode drain, and also short the diode gate and drain." }, { "NLPfilename": "DegenCommonGate", - "LLMprompt": "Create a degen common gate using two nfets: one named isrc and the other named load. Short the load drain and isrc source." + "LLMprompt": "Design a degenerated common gate stage with two NFETs named 'isrc' and 'load'. Short the load drain and isrc source." }, { "NLPfilename": "PTATVoltageGen", - "LLMprompt": "A PTAT (proportional to absolute temperature) voltage generator includes a mirror nmos and a bias nmos. Place the bias below the mirror, short the gates, and route the mirror gate to its drain and the source of the mirror to the bias drain." + "LLMprompt": "Design a PTAT voltage generator with a mirror NMOS and a bias NMOS. Place the bias below the mirror and short the gates. Route the gate of the mirror to its drain and the source of the mirror to the drain of the bias." + }, + { + "NLPfilename": "ConstBiasVoltageGen", + "LLMprompt": "Design a bias voltage generator using two N-type transistors with different threshold voltages. Connect the source of the first transistor (source) to the drain of the second transistor (load), and connect the load gate to its drain. Connect the gate of the source to the source of the load. Parametrize everything without using any matching techniques." + }, + { + "NLPfilename": "DegenCommonSource", + "LLMprompt": "Design a degenerated common source stage with two NFETs named 'isrc' and 'degen'. Connect the source of 'isrc' to the drain of 'degen' and short the gates of both transistors. Parametrize everything without using any matching techniques." + }, + { + "NLPfilename": "RegulatedCascode", + "LLMprompt": "Design a regulated cascode with two NMOS transistors named 'cascode' and 'feedback'. Connect the gate of 'cascode' to the drain of 'feedback' and the gate of 'feedback' to the source of 'cascode'. Parametrize everything without using any matching techniques." + }, + { + "NLPfilename": "ClassBPushPullInterdigitated", + "LLMprompt": "Design an interdigitated class B push-pull amplifier. Parametrize the width, length, and fingers." + }, + { + "NLPfilename": "CascodeCommonGateInterdigitated", + "LLMprompt": "Design an interdigitated cascode common gate stage. Parametrize the width, length, and fingers." + }, + { + "NLPfilename": "CascodeCommonSourceInterdigitated", + "LLMprompt": "Design an interdigitated cascode common source stage with an input NMOS and a bias NFET. Connect the bias source to the input drain and parametrize everything." + }, + { + "NLPfilename": "ClassBPushPullInterdigitated", + "LLMprompt": "Design an interdigitated class B push-pull amplifier. Place an NFET named 'supply' and a PFET named 'absorb'. Parametrize everything, route the sources together, and route the gates together." + }, + { + "NLPfilename": "CascodeCommonGateInterdigitated", + "LLMprompt": "Design an interdigitated cascode common gate stage with two NFETs: an input NFET and an output NFET. Connect the source of the input to the drain of the output. Parametrize everything and match the transistors through interdigitation." + }, + { + "NLPfilename": "CascodeCommonSourceInterdigitated", + "LLMprompt": "Design an interdigitated cascode common source stage with an input NMOS and a bias NFET. Connect the bias source to the input drain and parametrize everything." + }, + { + "NLPfilename": "CascodeCommonGateCommonCentroid", + "LLMprompt": "Design a cascode common gate stage with two NFETs: an input NFET and an output NFET. Connect the source of the input to the drain of the output. Parametrize everything and match the transistors using common centroid placement." } ] } diff --git a/openfasoc/generators/glayout/glayout/llm/syntax_data/train.json b/openfasoc/generators/glayout/glayout/llm/syntax_data/train.json index e6595714c..bc2b9602c 100644 --- a/openfasoc/generators/glayout/glayout/llm/syntax_data/train.json +++ b/openfasoc/generators/glayout/glayout/llm/syntax_data/train.json @@ -2,7 +2,7 @@ "data": [ { "NLPfilename": "BiasVoltageGenerator", - "LLMprompt": "A generic BiasVoltageGenerator contains a src pmos and a load nmos. The load should be below the src. The drains of both transistors and load gate should be shorted. Connect the src gate and load source. " + "LLMprompt": "A generic BiasVoltageGenerator contains a src pmos and a load nmos. The load should be below the src. The drains of both transistors and load gate should be shorted. Connect the src gate and load source." }, { "NLPfilename": "CrossCoupledInverters", @@ -50,7 +50,7 @@ }, { "NLPfilename": "CurrentMirrorNtypeInterdigitated", - "LLMprompt": "Use interdigitized matching to create an n-type current mirror. Parametrize width, length, and fingers." + "LLMprompt": "Use interdigitized placement matching to create an n-type current mirror. Parametrize width, length, and fingers." }, { "NLPfilename": "NAND", @@ -130,11 +130,15 @@ }, { "NLPfilename": "CascodeCommonGateInterdigitated", - "LLMprompt": "A cascode common gate stage consists of 2 nfets, an input nfet and output nfet. The source of the input and drain of the output are connected. Do not use any matching techniques, just place the output above the input. Parametrize everything. The transistors should be matched through interdigitation." + "LLMprompt": "A cascode common gate stage consists of 2 nfets, an input nfet and output nfet. The source of the input and drain of the output are connected. Parametrize everything. The transistors should be matched through interdigitation." }, { "NLPfilename": "CascodeCommonSourceInterdigitated", - "LLMprompt": "A cascode common source consists of an input nmos and bias nfet, both of which are interdigitated. The bias source is connected to the input drain. parametrize everything." + "LLMprompt": "A cascode common source consists of an input nmos and bias nfet. both of which are interdigitated. The bias source is connected to the input drain. parametrize everything." + }, + { + "NLPfilename": "CascodeCommonGateCommonCentroid", + "LLMprompt": "A cascode common gate stage consists of 2 nfets, an input nfet and output nfet. The source of the input and drain of the output are connected. Parametrize everything. The transistors should be matched using common centroid placement." } ] } diff --git a/openfasoc/generators/glayout/glayout/llm/train_and_run.py b/openfasoc/generators/glayout/glayout/llm/train_and_run.py index f2ac20c69..9da7b736b 100644 --- a/openfasoc/generators/glayout/glayout/llm/train_and_run.py +++ b/openfasoc/generators/glayout/glayout/llm/train_and_run.py @@ -85,8 +85,11 @@ def load_model_and_tokenizer(device: str, lora: bool = True) -> tuple: """ qlora = True # load model - modelname = "microsoft/Phi-3-mini-128k-instruct" - #modelname = "mistralai/Codestral-22B-v0.1" + # when use codestral on 80GB GPU, you may need to set the following in your env + # PYTORCH_CUDA_ALLOC_CONF=garbage_collection_threshold:0.6,max_split_size_mb:128 + # reduce epochs to 2 + #modelname = "microsoft/Phi-3-mini-128k-instruct" + modelname = "mistralai/Codestral-22B-v0.1" #modelname = "mistralai/Mistral-7B-Instruct-v0.3" global microsoft_model global mistral_model @@ -117,7 +120,7 @@ def load_model_and_tokenizer(device: str, lora: bool = True) -> tuple: lora_alpha=16, lora_dropout=0.05, bias="none", - target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], + target_modules=["q_proj", "k_proj", "v_proj"], ) model = get_peft_model(model, peft_config) model.print_trainable_parameters() @@ -227,9 +230,9 @@ def run_full_SFT_training() -> tuple: # hyperparameters lr = 5e-5 batch_size = 1 # 2 #4 - num_epochs = 4 + num_epochs = 2 # define training arguments - output_dir = Path(__file__).resolve().parent / "glayout_llm_checkpoints" + output_dir = Path(__file__).resolve().parent / ("glayout_llm_checkpoints" + ("phi" if microsoft_model else "mstrl")) training_args = TrainingArguments( output_dir=str(output_dir), learning_rate=lr, @@ -247,7 +250,7 @@ def run_full_SFT_training() -> tuple: gradient_accumulation_steps=1, warmup_steps=1, bf16=True, - optim="paged_adamw_8bit", + optim="paged_adamw_8bit" ) #training_args = TrainingArguments(output_dir=str(output_dir)) if microsoft_model: diff --git a/openfasoc/generators/glayout/glayout/syntaxer/relational.py b/openfasoc/generators/glayout/glayout/syntaxer/relational.py index 35e190163..e31e6265e 100644 --- a/openfasoc/generators/glayout/glayout/syntaxer/relational.py +++ b/openfasoc/generators/glayout/glayout/syntaxer/relational.py @@ -715,6 +715,7 @@ def __init__(self, toplvl_name: str): self.update_import_table(generic_4T_interdigitzed_aliases, "generic_4T_interdigitzed", "glayout.flow.placement.four_transistor_interdigitized") two_pfet_interdigitized_aliases = list_cartesian_product(["interdigitized","interdigitated"],["pmos","pfet"],True) self.update_import_table(two_pfet_interdigitized_aliases,"two_pfet_interdigitized","glayout.flow.placement.two_transistor_interdigitized") + self.update_import_table(["common centroid"],"common_centroid_ab_ba","glayout.flow.placement.common_centroid_ab_ba") self.update_import_table(["diff pair","diff_pair","differential pair","differential pairs","differential transistor"],"diff_pair_generic","glayout.flow.blocks.diff_pair") # import routing funcs self.update_import_table(["smart route","smart","smart_route"],"smart_route","glayout.flow.routing.smart_route") From 070795c58d9454ba863cc825e6eeec2a541b9d81 Mon Sep 17 00:00:00 2001 From: Sakib Pathen <107497530+srpathen@users.noreply.github.com> Date: Wed, 19 Jun 2024 17:53:53 -0400 Subject: [PATCH 3/8] Add GLayout introduction notebook --- .../glayout/GLayout_Introduction.ipynb | 2239 +++++++++++++++++ 1 file changed, 2239 insertions(+) create mode 100644 docs/source/notebooks/glayout/GLayout_Introduction.ipynb diff --git a/docs/source/notebooks/glayout/GLayout_Introduction.ipynb b/docs/source/notebooks/glayout/GLayout_Introduction.ipynb new file mode 100644 index 000000000..ab026b943 --- /dev/null +++ b/docs/source/notebooks/glayout/GLayout_Introduction.ipynb @@ -0,0 +1,2239 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "aK2t7aSWNojQ" + }, + "source": [ + "# GLayout Quick Start Guide\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github" + }, + "source": [ + "\"Open\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xjDewsT5Y4lP" + }, + "source": [ + "```\n", + "OpenFASOC Team, Feb 2024\n", + "SPDX-License-Identifier: Apache-2.0\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-Xp4cEjkeHIx" + }, + "source": [ + "## Introduction\n", + "Welcome!\n", + "This notebook serves as an introduction to the GDSFactory-based layout automation tool **GLayout** and a demonstration of the functions and classes you will primarily be using.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "j4dNshkgMM4I" + }, + "source": [ + "## Installation On Google Collab\n", + "### 1. Clone the repository and install dependencies\n", + "**Python Dependencies**\n", + "* [`gdsfactory`](https://github.com/gdsfactory/gdsfactory): Provides the backend for GDS manipulation.\n", + "* [`sky130`](https://github.com/gdsfactory/skywater130): The Skywater 130nm PDK Python package for GDSFactory to use in this demo.\n", + "* [`gf180`](https://github.com/gdsfactory/gf180): The GF 180nm PDK Python package for GDSFactory to use in this demo.\n", + "* [`gdstk`](https://heitzmann.github.io/gdstk/): (installed as a part of gdsfactory) Used for converting GDS files into SVG images for viewing.\n", + "* [`svgutils`](https://svgutils.readthedocs.io/en/latest/): To scale the SVG image.\n", + "\n", + "**System Dependencies**\n", + "* [`klayout`](https://klayout.de/): For DRC (Design Rule Checking).\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bANz_LDB8TQW" + }, + "source": [ + "#### 1.1. Installing the binary dependency `klayout` using micromamba\n", + "**You only need to run this once**" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "JzDjayJIMSHe", + "scrolled": true, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "215f680e-fb6f-4b35-b02d-5e9a5ca62ac4" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "fatal: destination path 'OpenFASOC' already exists and is not an empty directory.\n", + "Requirement already satisfied: sky130 in /usr/local/lib/python3.10/dist-packages (0.11.1)\n", + "Collecting gdsfactory~=7.26.1 (from sky130)\n", + " Using cached gdsfactory-7.26.1-py3-none-any.whl (839 kB)\n", + "Requirement already satisfied: PySpice in /usr/local/lib/python3.10/dist-packages (from sky130) (1.5)\n", + "Requirement already satisfied: flatdict in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (4.0.1)\n", + "Requirement already satisfied: gdstk<0.10,>=0.9.49 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (0.9.52)\n", + "Requirement already satisfied: jinja2<4 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (3.1.4)\n", + "Requirement already satisfied: loguru<1 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (0.7.2)\n", + "Requirement already satisfied: matplotlib<4 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (3.7.1)\n", + "Requirement already satisfied: numpy<2 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (1.25.2)\n", + "Requirement already satisfied: omegaconf<3 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (2.3.0)\n", + "Requirement already satisfied: orjson<4 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (3.10.5)\n", + "Requirement already satisfied: pandas<3 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (2.0.3)\n", + "Requirement already satisfied: pydantic<2.8,>=2 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (2.6.4)\n", + "Requirement already satisfied: pydantic-settings<3 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (2.2.1)\n", + "Requirement already satisfied: pydantic-extra-types<3 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (2.8.2)\n", + "Requirement already satisfied: pyyaml in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (6.0.1)\n", + "Requirement already satisfied: qrcode in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (7.4.2)\n", + "Requirement already satisfied: rectpack<1 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (0.2.2)\n", + "Requirement already satisfied: rich<14 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (13.7.1)\n", + "Requirement already satisfied: scipy<2 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (1.11.4)\n", + "Requirement already satisfied: shapely<3 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (2.0.4)\n", + "Requirement already satisfied: toolz<1 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (0.12.1)\n", + "Requirement already satisfied: types-PyYAML in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (6.0.12.20240311)\n", + "Requirement already satisfied: typer<1 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (0.12.3)\n", + "Requirement already satisfied: watchdog<5 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (4.0.1)\n", + "Requirement already satisfied: kfactory[git,ipy]<0.13,>=0.9.1 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (0.11.4)\n", + "Requirement already satisfied: freetype-py in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (2.4.0)\n", + "Requirement already satisfied: mapbox_earcut in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (1.0.1)\n", + "Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (3.3)\n", + "Requirement already satisfied: pyglet<2 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (1.5.29)\n", + "Requirement already satisfied: scikit-image in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (0.19.3)\n", + "Requirement already satisfied: trimesh<4.4,>=4 in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (4.1.8)\n", + "Requirement already satisfied: ipycytoscape in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (1.3.3)\n", + "Requirement already satisfied: ipyevents in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (2.0.2)\n", + "Requirement already satisfied: ipykernel in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (5.5.6)\n", + "Requirement already satisfied: ipympl in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (0.9.4)\n", + "Requirement already satisfied: ipytree in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (0.2.2)\n", + "Requirement already satisfied: ipywidgets in /usr/local/lib/python3.10/dist-packages (from gdsfactory~=7.26.1->sky130) (7.7.1)\n", + "Requirement already satisfied: cffi>=1.14 in /usr/local/lib/python3.10/dist-packages (from PySpice->sky130) (1.16.0)\n", + "Requirement already satisfied: ply>=3.11 in /usr/local/lib/python3.10/dist-packages (from PySpice->sky130) (3.11)\n", + "Requirement already satisfied: requests>=2.23 in /usr/local/lib/python3.10/dist-packages (from PySpice->sky130) (2.31.0)\n", + "Requirement already satisfied: pycparser in /usr/local/lib/python3.10/dist-packages (from cffi>=1.14->PySpice->sky130) (2.22)\n", + "Requirement already satisfied: typing_extensions in /usr/local/lib/python3.10/dist-packages (from gdstk<0.10,>=0.9.49->gdsfactory~=7.26.1->sky130) (4.12.2)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2<4->gdsfactory~=7.26.1->sky130) (2.1.5)\n", + "Requirement already satisfied: klayout>=0.28.17 in /usr/local/lib/python3.10/dist-packages (from kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (0.29.2)\n", + "Requirement already satisfied: ruamel.yaml in /usr/local/lib/python3.10/dist-packages (from kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (0.18.6)\n", + "Requirement already satisfied: cachetools>=5.2.0 in /usr/local/lib/python3.10/dist-packages (from kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (5.3.3)\n", + "Requirement already satisfied: tomli in /usr/local/lib/python3.10/dist-packages (from kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (2.0.1)\n", + "Requirement already satisfied: aenum in /usr/local/lib/python3.10/dist-packages (from kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (3.1.15)\n", + "Requirement already satisfied: ipython in /usr/local/lib/python3.10/dist-packages (from kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (7.34.0)\n", + "Requirement already satisfied: gitpython in /usr/local/lib/python3.10/dist-packages (from kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (3.1.43)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib<4->gdsfactory~=7.26.1->sky130) (1.2.1)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib<4->gdsfactory~=7.26.1->sky130) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib<4->gdsfactory~=7.26.1->sky130) (4.53.0)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib<4->gdsfactory~=7.26.1->sky130) (1.4.5)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib<4->gdsfactory~=7.26.1->sky130) (24.1)\n", + "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib<4->gdsfactory~=7.26.1->sky130) (9.4.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib<4->gdsfactory~=7.26.1->sky130) (3.1.2)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib<4->gdsfactory~=7.26.1->sky130) (2.8.2)\n", + "Requirement already satisfied: antlr4-python3-runtime==4.9.* in /usr/local/lib/python3.10/dist-packages (from omegaconf<3->gdsfactory~=7.26.1->sky130) (4.9.3)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas<3->gdsfactory~=7.26.1->sky130) (2023.4)\n", + "Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas<3->gdsfactory~=7.26.1->sky130) (2024.1)\n", + "Requirement already satisfied: annotated-types>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from pydantic<2.8,>=2->gdsfactory~=7.26.1->sky130) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.16.3 in /usr/local/lib/python3.10/dist-packages (from pydantic<2.8,>=2->gdsfactory~=7.26.1->sky130) (2.16.3)\n", + "Requirement already satisfied: python-dotenv>=0.21.0 in /usr/local/lib/python3.10/dist-packages (from pydantic-settings<3->gdsfactory~=7.26.1->sky130) (1.0.1)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.23->PySpice->sky130) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.23->PySpice->sky130) (3.7)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.23->PySpice->sky130) (2.0.7)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.23->PySpice->sky130) (2024.6.2)\n", + "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from rich<14->gdsfactory~=7.26.1->sky130) (3.0.0)\n", + "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.10/dist-packages (from rich<14->gdsfactory~=7.26.1->sky130) (2.16.1)\n", + "Requirement already satisfied: click>=8.0.0 in /usr/local/lib/python3.10/dist-packages (from typer<1->gdsfactory~=7.26.1->sky130) (8.1.7)\n", + "Requirement already satisfied: shellingham>=1.3.0 in /usr/local/lib/python3.10/dist-packages (from typer<1->gdsfactory~=7.26.1->sky130) (1.5.4)\n", + "Requirement already satisfied: spectate>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from ipycytoscape->gdsfactory~=7.26.1->sky130) (1.0.1)\n", + "Requirement already satisfied: ipython-genutils~=0.2.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->gdsfactory~=7.26.1->sky130) (0.2.0)\n", + "Requirement already satisfied: traitlets>=4.3.1 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->gdsfactory~=7.26.1->sky130) (5.7.1)\n", + "Requirement already satisfied: widgetsnbextension~=3.6.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->gdsfactory~=7.26.1->sky130) (3.6.6)\n", + "Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->gdsfactory~=7.26.1->sky130) (3.0.11)\n", + "Requirement already satisfied: jupyter-client in /usr/local/lib/python3.10/dist-packages (from ipykernel->gdsfactory~=7.26.1->sky130) (6.1.12)\n", + "Requirement already satisfied: tornado>=4.2 in /usr/local/lib/python3.10/dist-packages (from ipykernel->gdsfactory~=7.26.1->sky130) (6.3.3)\n", + "Requirement already satisfied: pypng in /usr/local/lib/python3.10/dist-packages (from qrcode->gdsfactory~=7.26.1->sky130) (0.20220715.0)\n", + "Requirement already satisfied: imageio>=2.4.1 in /usr/local/lib/python3.10/dist-packages (from scikit-image->gdsfactory~=7.26.1->sky130) (2.31.6)\n", + "Requirement already satisfied: tifffile>=2019.7.26 in /usr/local/lib/python3.10/dist-packages (from scikit-image->gdsfactory~=7.26.1->sky130) (2024.5.22)\n", + "Requirement already satisfied: PyWavelets>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from scikit-image->gdsfactory~=7.26.1->sky130) (1.6.0)\n", + "Requirement already satisfied: setuptools>=18.5 in /usr/local/lib/python3.10/dist-packages (from ipython->kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (67.7.2)\n", + "Requirement already satisfied: jedi>=0.16 in /usr/local/lib/python3.10/dist-packages (from ipython->kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (0.19.1)\n", + "Requirement already satisfied: decorator in /usr/local/lib/python3.10/dist-packages (from ipython->kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (4.4.2)\n", + "Requirement already satisfied: pickleshare in /usr/local/lib/python3.10/dist-packages (from ipython->kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (0.7.5)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from ipython->kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (3.0.47)\n", + "Requirement already satisfied: backcall in /usr/local/lib/python3.10/dist-packages (from ipython->kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (0.2.0)\n", + "Requirement already satisfied: matplotlib-inline in /usr/local/lib/python3.10/dist-packages (from ipython->kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (0.1.7)\n", + "Requirement already satisfied: pexpect>4.3 in /usr/local/lib/python3.10/dist-packages (from ipython->kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (4.9.0)\n", + "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.10/dist-packages (from markdown-it-py>=2.2.0->rich<14->gdsfactory~=7.26.1->sky130) (0.1.2)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib<4->gdsfactory~=7.26.1->sky130) (1.16.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /usr/local/lib/python3.10/dist-packages (from widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (6.5.5)\n", + "Requirement already satisfied: gitdb<5,>=4.0.1 in /usr/local/lib/python3.10/dist-packages (from gitpython->kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (4.0.11)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in /usr/local/lib/python3.10/dist-packages (from jupyter-client->ipykernel->gdsfactory~=7.26.1->sky130) (5.7.2)\n", + "Requirement already satisfied: pyzmq>=13 in /usr/local/lib/python3.10/dist-packages (from jupyter-client->ipykernel->gdsfactory~=7.26.1->sky130) (24.0.1)\n", + "Requirement already satisfied: ruamel.yaml.clib>=0.2.7 in /usr/local/lib/python3.10/dist-packages (from ruamel.yaml->kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (0.2.8)\n", + "\u001b[33mWARNING: typer 0.12.3 does not provide the extra 'all'\u001b[0m\u001b[33m\n", + "\u001b[0mRequirement already satisfied: smmap<6,>=3.0.1 in /usr/local/lib/python3.10/dist-packages (from gitdb<5,>=4.0.1->gitpython->kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (5.0.1)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.3 in /usr/local/lib/python3.10/dist-packages (from jedi>=0.16->ipython->kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (0.8.4)\n", + "Requirement already satisfied: platformdirs>=2.5 in /usr/local/lib/python3.10/dist-packages (from jupyter-core>=4.6.0->jupyter-client->ipykernel->gdsfactory~=7.26.1->sky130) (4.2.2)\n", + "Requirement already satisfied: argon2-cffi in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (23.1.0)\n", + "Requirement already satisfied: nbformat in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (5.10.4)\n", + "Requirement already satisfied: nbconvert>=5 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (6.5.4)\n", + "Requirement already satisfied: nest-asyncio>=1.5 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (1.6.0)\n", + "Requirement already satisfied: Send2Trash>=1.8.0 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (1.8.3)\n", + "Requirement already satisfied: terminado>=0.8.3 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (0.18.1)\n", + "Requirement already satisfied: prometheus-client in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (0.20.0)\n", + "Requirement already satisfied: nbclassic>=0.4.7 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (1.1.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.10/dist-packages (from pexpect>4.3->ipython->kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /usr/local/lib/python3.10/dist-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython->kfactory[git,ipy]<0.13,>=0.9.1->gdsfactory~=7.26.1->sky130) (0.2.13)\n", + "Requirement already satisfied: notebook-shim>=0.2.3 in /usr/local/lib/python3.10/dist-packages (from nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (0.2.4)\n", + "Requirement already satisfied: lxml in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (4.9.4)\n", + "Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (4.12.3)\n", + "Requirement already satisfied: bleach in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (6.1.0)\n", + "Requirement already satisfied: defusedxml in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (0.7.1)\n", + "Requirement already satisfied: entrypoints>=0.2.2 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (0.4)\n", + "Requirement already satisfied: jupyterlab-pygments in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (0.3.0)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (0.8.4)\n", + "Requirement already satisfied: nbclient>=0.5.0 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (0.10.0)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (1.5.1)\n", + "Requirement already satisfied: tinycss2 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (1.3.0)\n", + "Requirement already satisfied: fastjsonschema>=2.15 in /usr/local/lib/python3.10/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (2.19.1)\n", + "Requirement already satisfied: jsonschema>=2.6 in /usr/local/lib/python3.10/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (4.19.2)\n", + "Requirement already satisfied: argon2-cffi-bindings in /usr/local/lib/python3.10/dist-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (21.2.0)\n", + "Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (23.2.0)\n", + "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (2023.12.1)\n", + "Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (0.35.1)\n", + "Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (0.18.1)\n", + "Requirement already satisfied: jupyter-server<3,>=1.8 in /usr/local/lib/python3.10/dist-packages (from notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (1.24.0)\n", + "Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.10/dist-packages (from beautifulsoup4->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (2.5)\n", + "Requirement already satisfied: webencodings in /usr/local/lib/python3.10/dist-packages (from bleach->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (0.5.1)\n", + "Requirement already satisfied: anyio<4,>=3.1.0 in /usr/local/lib/python3.10/dist-packages (from jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (3.7.1)\n", + "Requirement already satisfied: websocket-client in /usr/local/lib/python3.10/dist-packages (from jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (1.8.0)\n", + "Requirement already satisfied: sniffio>=1.1 in /usr/local/lib/python3.10/dist-packages (from anyio<4,>=3.1.0->jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (1.3.1)\n", + "Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from anyio<4,>=3.1.0->jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory~=7.26.1->sky130) (1.2.1)\n", + "Installing collected packages: gdsfactory\n", + " Attempting uninstall: gdsfactory\n", + " Found existing installation: gdsfactory 7.16.0\n", + " Uninstalling gdsfactory-7.16.0:\n", + " Successfully uninstalled gdsfactory-7.16.0\n", + "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "gf180 0.1.0 requires gdsfactory<7.17,>=7.16.0, but you have gdsfactory 7.26.1 which is incompatible.\u001b[0m\u001b[31m\n", + "\u001b[0mSuccessfully installed gdsfactory-7.26.1\n", + "Requirement already satisfied: gf180 in /usr/local/lib/python3.10/dist-packages (0.1.0)\n", + "Requirement already satisfied: prettyprinttree in /usr/local/lib/python3.10/dist-packages (2.0.0)\n", + "Requirement already satisfied: svgutils in /usr/local/lib/python3.10/dist-packages (0.3.4)\n", + "Collecting gdsfactory<7.17,>=7.16.0 (from gf180)\n", + " Using cached gdsfactory-7.16.0-py3-none-any.whl (834 kB)\n", + "Requirement already satisfied: colorama in /usr/local/lib/python3.10/dist-packages (from prettyprinttree) (0.4.6)\n", + "Requirement already satisfied: cmd2 in /usr/local/lib/python3.10/dist-packages (from prettyprinttree) (2.4.3)\n", + "Requirement already satisfied: lxml in /usr/local/lib/python3.10/dist-packages (from svgutils) (4.9.4)\n", + "Requirement already satisfied: flatdict in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (4.0.1)\n", + "Requirement already satisfied: gdstk<0.10,>=0.9.49 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (0.9.52)\n", + "Requirement already satisfied: jinja2<4 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (3.1.4)\n", + "Requirement already satisfied: loguru<1 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (0.7.2)\n", + "Requirement already satisfied: matplotlib<4 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (3.7.1)\n", + "Requirement already satisfied: numpy<2 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (1.25.2)\n", + "Requirement already satisfied: omegaconf<3 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (2.3.0)\n", + "Requirement already satisfied: orjson<4 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (3.10.5)\n", + "Requirement already satisfied: pandas<3 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (2.0.3)\n", + "Requirement already satisfied: pydantic<2.7,>=2 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (2.6.4)\n", + "Requirement already satisfied: pydantic-settings<3 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (2.2.1)\n", + "Requirement already satisfied: pydantic-extra-types<3 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (2.8.2)\n", + "Requirement already satisfied: pyyaml in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (6.0.1)\n", + "Requirement already satisfied: qrcode in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (7.4.2)\n", + "Requirement already satisfied: rectpack<1 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (0.2.2)\n", + "Requirement already satisfied: rich<14 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (13.7.1)\n", + "Requirement already satisfied: scipy<2 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (1.11.4)\n", + "Requirement already satisfied: shapely<3 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (2.0.4)\n", + "Requirement already satisfied: toolz<1 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (0.12.1)\n", + "Requirement already satisfied: types-PyYAML in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (6.0.12.20240311)\n", + "Requirement already satisfied: typer<1 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (0.12.3)\n", + "Requirement already satisfied: watchdog<5 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (4.0.1)\n", + "Requirement already satisfied: kfactory[git,ipy]<0.12,>=0.9.1 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (0.11.4)\n", + "Requirement already satisfied: freetype-py in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (2.4.0)\n", + "Requirement already satisfied: mapbox_earcut in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (1.0.1)\n", + "Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (3.3)\n", + "Requirement already satisfied: pyglet<2 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (1.5.29)\n", + "Requirement already satisfied: scikit-image in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (0.19.3)\n", + "Requirement already satisfied: trimesh<4.2,>=4 in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (4.1.8)\n", + "Requirement already satisfied: ipycytoscape in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (1.3.3)\n", + "Requirement already satisfied: ipyevents in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (2.0.2)\n", + "Requirement already satisfied: ipykernel in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (5.5.6)\n", + "Requirement already satisfied: ipympl in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (0.9.4)\n", + "Requirement already satisfied: ipytree in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (0.2.2)\n", + "Requirement already satisfied: ipywidgets in /usr/local/lib/python3.10/dist-packages (from gdsfactory<7.17,>=7.16.0->gf180) (7.7.1)\n", + "Requirement already satisfied: attrs>=16.3.0 in /usr/local/lib/python3.10/dist-packages (from cmd2->prettyprinttree) (23.2.0)\n", + "Requirement already satisfied: pyperclip>=1.6 in /usr/local/lib/python3.10/dist-packages (from cmd2->prettyprinttree) (1.8.2)\n", + "Requirement already satisfied: wcwidth>=0.1.7 in /usr/local/lib/python3.10/dist-packages (from cmd2->prettyprinttree) (0.2.13)\n", + "Requirement already satisfied: typing_extensions in /usr/local/lib/python3.10/dist-packages (from gdstk<0.10,>=0.9.49->gdsfactory<7.17,>=7.16.0->gf180) (4.12.2)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2<4->gdsfactory<7.17,>=7.16.0->gf180) (2.1.5)\n", + "Requirement already satisfied: klayout>=0.28.17 in /usr/local/lib/python3.10/dist-packages (from kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (0.29.2)\n", + "Requirement already satisfied: ruamel.yaml in /usr/local/lib/python3.10/dist-packages (from kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (0.18.6)\n", + "Requirement already satisfied: cachetools>=5.2.0 in /usr/local/lib/python3.10/dist-packages (from kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (5.3.3)\n", + "Requirement already satisfied: tomli in /usr/local/lib/python3.10/dist-packages (from kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (2.0.1)\n", + "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (2.31.0)\n", + "Requirement already satisfied: aenum in /usr/local/lib/python3.10/dist-packages (from kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (3.1.15)\n", + "Requirement already satisfied: ipython in /usr/local/lib/python3.10/dist-packages (from kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (7.34.0)\n", + "Requirement already satisfied: gitpython in /usr/local/lib/python3.10/dist-packages (from kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (3.1.43)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib<4->gdsfactory<7.17,>=7.16.0->gf180) (1.2.1)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib<4->gdsfactory<7.17,>=7.16.0->gf180) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib<4->gdsfactory<7.17,>=7.16.0->gf180) (4.53.0)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib<4->gdsfactory<7.17,>=7.16.0->gf180) (1.4.5)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib<4->gdsfactory<7.17,>=7.16.0->gf180) (24.1)\n", + "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib<4->gdsfactory<7.17,>=7.16.0->gf180) (9.4.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib<4->gdsfactory<7.17,>=7.16.0->gf180) (3.1.2)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib<4->gdsfactory<7.17,>=7.16.0->gf180) (2.8.2)\n", + "Requirement already satisfied: antlr4-python3-runtime==4.9.* in /usr/local/lib/python3.10/dist-packages (from omegaconf<3->gdsfactory<7.17,>=7.16.0->gf180) (4.9.3)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas<3->gdsfactory<7.17,>=7.16.0->gf180) (2023.4)\n", + "Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas<3->gdsfactory<7.17,>=7.16.0->gf180) (2024.1)\n", + "Requirement already satisfied: annotated-types>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from pydantic<2.7,>=2->gdsfactory<7.17,>=7.16.0->gf180) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.16.3 in /usr/local/lib/python3.10/dist-packages (from pydantic<2.7,>=2->gdsfactory<7.17,>=7.16.0->gf180) (2.16.3)\n", + "Requirement already satisfied: python-dotenv>=0.21.0 in /usr/local/lib/python3.10/dist-packages (from pydantic-settings<3->gdsfactory<7.17,>=7.16.0->gf180) (1.0.1)\n", + "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from rich<14->gdsfactory<7.17,>=7.16.0->gf180) (3.0.0)\n", + "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.10/dist-packages (from rich<14->gdsfactory<7.17,>=7.16.0->gf180) (2.16.1)\n", + "Requirement already satisfied: click>=8.0.0 in /usr/local/lib/python3.10/dist-packages (from typer<1->gdsfactory<7.17,>=7.16.0->gf180) (8.1.7)\n", + "Requirement already satisfied: shellingham>=1.3.0 in /usr/local/lib/python3.10/dist-packages (from typer<1->gdsfactory<7.17,>=7.16.0->gf180) (1.5.4)\n", + "Requirement already satisfied: spectate>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from ipycytoscape->gdsfactory<7.17,>=7.16.0->gf180) (1.0.1)\n", + "Requirement already satisfied: ipython-genutils~=0.2.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (0.2.0)\n", + "Requirement already satisfied: traitlets>=4.3.1 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (5.7.1)\n", + "Requirement already satisfied: widgetsnbextension~=3.6.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (3.6.6)\n", + "Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (3.0.11)\n", + "Requirement already satisfied: jupyter-client in /usr/local/lib/python3.10/dist-packages (from ipykernel->gdsfactory<7.17,>=7.16.0->gf180) (6.1.12)\n", + "Requirement already satisfied: tornado>=4.2 in /usr/local/lib/python3.10/dist-packages (from ipykernel->gdsfactory<7.17,>=7.16.0->gf180) (6.3.3)\n", + "Requirement already satisfied: pypng in /usr/local/lib/python3.10/dist-packages (from qrcode->gdsfactory<7.17,>=7.16.0->gf180) (0.20220715.0)\n", + "Requirement already satisfied: imageio>=2.4.1 in /usr/local/lib/python3.10/dist-packages (from scikit-image->gdsfactory<7.17,>=7.16.0->gf180) (2.31.6)\n", + "Requirement already satisfied: tifffile>=2019.7.26 in /usr/local/lib/python3.10/dist-packages (from scikit-image->gdsfactory<7.17,>=7.16.0->gf180) (2024.5.22)\n", + "Requirement already satisfied: PyWavelets>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from scikit-image->gdsfactory<7.17,>=7.16.0->gf180) (1.6.0)\n", + "Requirement already satisfied: setuptools>=18.5 in /usr/local/lib/python3.10/dist-packages (from ipython->kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (67.7.2)\n", + "Requirement already satisfied: jedi>=0.16 in /usr/local/lib/python3.10/dist-packages (from ipython->kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (0.19.1)\n", + "Requirement already satisfied: decorator in /usr/local/lib/python3.10/dist-packages (from ipython->kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (4.4.2)\n", + "Requirement already satisfied: pickleshare in /usr/local/lib/python3.10/dist-packages (from ipython->kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (0.7.5)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from ipython->kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (3.0.47)\n", + "Requirement already satisfied: backcall in /usr/local/lib/python3.10/dist-packages (from ipython->kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (0.2.0)\n", + "Requirement already satisfied: matplotlib-inline in /usr/local/lib/python3.10/dist-packages (from ipython->kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (0.1.7)\n", + "Requirement already satisfied: pexpect>4.3 in /usr/local/lib/python3.10/dist-packages (from ipython->kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (4.9.0)\n", + "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.10/dist-packages (from markdown-it-py>=2.2.0->rich<14->gdsfactory<7.17,>=7.16.0->gf180) (0.1.2)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib<4->gdsfactory<7.17,>=7.16.0->gf180) (1.16.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /usr/local/lib/python3.10/dist-packages (from widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (6.5.5)\n", + "Requirement already satisfied: gitdb<5,>=4.0.1 in /usr/local/lib/python3.10/dist-packages (from gitpython->kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (4.0.11)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in /usr/local/lib/python3.10/dist-packages (from jupyter-client->ipykernel->gdsfactory<7.17,>=7.16.0->gf180) (5.7.2)\n", + "Requirement already satisfied: pyzmq>=13 in /usr/local/lib/python3.10/dist-packages (from jupyter-client->ipykernel->gdsfactory<7.17,>=7.16.0->gf180) (24.0.1)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (3.7)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (2.0.7)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (2024.6.2)\n", + "Requirement already satisfied: ruamel.yaml.clib>=0.2.7 in /usr/local/lib/python3.10/dist-packages (from ruamel.yaml->kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (0.2.8)\n", + "\u001b[33mWARNING: typer 0.12.3 does not provide the extra 'all'\u001b[0m\u001b[33m\n", + "\u001b[0mRequirement already satisfied: smmap<6,>=3.0.1 in /usr/local/lib/python3.10/dist-packages (from gitdb<5,>=4.0.1->gitpython->kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (5.0.1)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.3 in /usr/local/lib/python3.10/dist-packages (from jedi>=0.16->ipython->kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (0.8.4)\n", + "Requirement already satisfied: platformdirs>=2.5 in /usr/local/lib/python3.10/dist-packages (from jupyter-core>=4.6.0->jupyter-client->ipykernel->gdsfactory<7.17,>=7.16.0->gf180) (4.2.2)\n", + "Requirement already satisfied: argon2-cffi in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (23.1.0)\n", + "Requirement already satisfied: nbformat in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (5.10.4)\n", + "Requirement already satisfied: nbconvert>=5 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (6.5.4)\n", + "Requirement already satisfied: nest-asyncio>=1.5 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (1.6.0)\n", + "Requirement already satisfied: Send2Trash>=1.8.0 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (1.8.3)\n", + "Requirement already satisfied: terminado>=0.8.3 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (0.18.1)\n", + "Requirement already satisfied: prometheus-client in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (0.20.0)\n", + "Requirement already satisfied: nbclassic>=0.4.7 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (1.1.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.10/dist-packages (from pexpect>4.3->ipython->kfactory[git,ipy]<0.12,>=0.9.1->gdsfactory<7.17,>=7.16.0->gf180) (0.7.0)\n", + "Requirement already satisfied: notebook-shim>=0.2.3 in /usr/local/lib/python3.10/dist-packages (from nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (0.2.4)\n", + "Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (4.12.3)\n", + "Requirement already satisfied: bleach in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (6.1.0)\n", + "Requirement already satisfied: defusedxml in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (0.7.1)\n", + "Requirement already satisfied: entrypoints>=0.2.2 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (0.4)\n", + "Requirement already satisfied: jupyterlab-pygments in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (0.3.0)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (0.8.4)\n", + "Requirement already satisfied: nbclient>=0.5.0 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (0.10.0)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (1.5.1)\n", + "Requirement already satisfied: tinycss2 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (1.3.0)\n", + "Requirement already satisfied: fastjsonschema>=2.15 in /usr/local/lib/python3.10/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (2.19.1)\n", + "Requirement already satisfied: jsonschema>=2.6 in /usr/local/lib/python3.10/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (4.19.2)\n", + "Requirement already satisfied: argon2-cffi-bindings in /usr/local/lib/python3.10/dist-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (21.2.0)\n", + "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (2023.12.1)\n", + "Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (0.35.1)\n", + "Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (0.18.1)\n", + "Requirement already satisfied: jupyter-server<3,>=1.8 in /usr/local/lib/python3.10/dist-packages (from notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (1.24.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (1.16.0)\n", + "Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.10/dist-packages (from beautifulsoup4->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (2.5)\n", + "Requirement already satisfied: webencodings in /usr/local/lib/python3.10/dist-packages (from bleach->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (0.5.1)\n", + "Requirement already satisfied: pycparser in /usr/local/lib/python3.10/dist-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (2.22)\n", + "Requirement already satisfied: anyio<4,>=3.1.0 in /usr/local/lib/python3.10/dist-packages (from jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (3.7.1)\n", + "Requirement already satisfied: websocket-client in /usr/local/lib/python3.10/dist-packages (from jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (1.8.0)\n", + "Requirement already satisfied: sniffio>=1.1 in /usr/local/lib/python3.10/dist-packages (from anyio<4,>=3.1.0->jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (1.3.1)\n", + "Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from anyio<4,>=3.1.0->jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->gdsfactory<7.17,>=7.16.0->gf180) (1.2.1)\n", + "Installing collected packages: gdsfactory\n", + " Attempting uninstall: gdsfactory\n", + " Found existing installation: gdsfactory 7.26.1\n", + " Uninstalling gdsfactory-7.26.1:\n", + " Successfully uninstalled gdsfactory-7.26.1\n", + "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "sky130 0.11.1 requires gdsfactory~=7.26.1, but you have gdsfactory 7.16.0 which is incompatible.\u001b[0m\u001b[31m\n", + "\u001b[0mSuccessfully installed gdsfactory-7.16.0\n", + "Collecting gdsfactory==7.7.0\n", + " Using cached gdsfactory-7.7.0-py3-none-any.whl (801 kB)\n", + "Requirement already satisfied: flatdict in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (4.0.1)\n", + "Requirement already satisfied: gdstk<1 in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (0.9.52)\n", + "Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (3.1.4)\n", + "Requirement already satisfied: loguru<1 in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (0.7.2)\n", + "Requirement already satisfied: matplotlib in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (3.7.1)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (1.25.2)\n", + "Requirement already satisfied: omegaconf<3 in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (2.3.0)\n", + "Requirement already satisfied: orjson in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (3.10.5)\n", + "Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (2.0.3)\n", + "Requirement already satisfied: pydantic<3,>=2 in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (2.6.4)\n", + "Requirement already satisfied: pydantic-settings in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (2.2.1)\n", + "Requirement already satisfied: pydantic-extra-types in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (2.8.2)\n", + "Requirement already satisfied: pyyaml in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (6.0.1)\n", + "Requirement already satisfied: qrcode in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (7.4.2)\n", + "Requirement already satisfied: rectpack in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (0.2.2)\n", + "Requirement already satisfied: rich in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (13.7.1)\n", + "Requirement already satisfied: scipy in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (1.11.4)\n", + "Requirement already satisfied: shapely<3 in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (2.0.4)\n", + "Requirement already satisfied: toolz in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (0.12.1)\n", + "Requirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (4.66.4)\n", + "Requirement already satisfied: types-PyYAML in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (6.0.12.20240311)\n", + "Requirement already satisfied: typer in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (0.12.3)\n", + "Requirement already satisfied: watchdog in /usr/local/lib/python3.10/dist-packages (from gdsfactory==7.7.0) (4.0.1)\n", + "Requirement already satisfied: typing_extensions in /usr/local/lib/python3.10/dist-packages (from gdstk<1->gdsfactory==7.7.0) (4.12.2)\n", + "Requirement already satisfied: antlr4-python3-runtime==4.9.* in /usr/local/lib/python3.10/dist-packages (from omegaconf<3->gdsfactory==7.7.0) (4.9.3)\n", + "Requirement already satisfied: annotated-types>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from pydantic<3,>=2->gdsfactory==7.7.0) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.16.3 in /usr/local/lib/python3.10/dist-packages (from pydantic<3,>=2->gdsfactory==7.7.0) (2.16.3)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->gdsfactory==7.7.0) (2.1.5)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->gdsfactory==7.7.0) (1.2.1)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib->gdsfactory==7.7.0) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->gdsfactory==7.7.0) (4.53.0)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->gdsfactory==7.7.0) (1.4.5)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->gdsfactory==7.7.0) (24.1)\n", + "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->gdsfactory==7.7.0) (9.4.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->gdsfactory==7.7.0) (3.1.2)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib->gdsfactory==7.7.0) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->gdsfactory==7.7.0) (2023.4)\n", + "Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas->gdsfactory==7.7.0) (2024.1)\n", + "Requirement already satisfied: python-dotenv>=0.21.0 in /usr/local/lib/python3.10/dist-packages (from pydantic-settings->gdsfactory==7.7.0) (1.0.1)\n", + "Requirement already satisfied: pypng in /usr/local/lib/python3.10/dist-packages (from qrcode->gdsfactory==7.7.0) (0.20220715.0)\n", + "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from rich->gdsfactory==7.7.0) (3.0.0)\n", + "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.10/dist-packages (from rich->gdsfactory==7.7.0) (2.16.1)\n", + "Requirement already satisfied: click>=8.0.0 in /usr/local/lib/python3.10/dist-packages (from typer->gdsfactory==7.7.0) (8.1.7)\n", + "Requirement already satisfied: shellingham>=1.3.0 in /usr/local/lib/python3.10/dist-packages (from typer->gdsfactory==7.7.0) (1.5.4)\n", + "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.10/dist-packages (from markdown-it-py>=2.2.0->rich->gdsfactory==7.7.0) (0.1.2)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib->gdsfactory==7.7.0) (1.16.0)\n", + "Installing collected packages: gdsfactory\n", + " Attempting uninstall: gdsfactory\n", + " Found existing installation: gdsfactory 7.16.0\n", + " Uninstalling gdsfactory-7.16.0:\n", + " Successfully uninstalled gdsfactory-7.16.0\n", + "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "gf180 0.1.0 requires gdsfactory<7.17,>=7.16.0, but you have gdsfactory 7.7.0 which is incompatible.\n", + "sky130 0.11.1 requires gdsfactory~=7.26.1, but you have gdsfactory 7.7.0 which is incompatible.\u001b[0m\u001b[31m\n", + "\u001b[0mSuccessfully installed gdsfactory-7.7.0\n", + "bin/micromamba\n", + "env: CONDA_PREFIX=/content/conda-env\n", + "Empty environment created at prefix: /content/conda-env\n", + "\u001b[?25l\u001b[2K\u001b[0G[+] 0.0s\n", + "litex-hub/linux-64.. ⣾ \n", + "litex-hub/noarch (.. ⣾ \n", + "main/linux-64 (che.. ⣾ \n", + "main/noarch (check.. ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 0.1s\n", + "litex-hub/linux-64.. ⣾ \n", + "litex-hub/noarch (.. ⣾ \n", + "main/linux-64 (che.. ⣾ \n", + "main/noarch (check.. ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 0.2s\n", + "litex-hub/linux-64.. ⣾ \n", + "litex-hub/noarch (.. ⣾ \n", + "main/linux-64 (che.. ⣾ \n", + "main/noarch (check.. ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gmain/noarch (check zst) \n", + "main/linux-64 (check zst) \n", + "[+] 0.3s\n", + "litex-hub/linux-64.. ⣾ \n", + "litex-hub/noarch (.. ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Glitex-hub/noarch (check zst) \n", + "[+] 0.4s\n", + "litex-hub/linux-64.. ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[0Glitex-hub/linux-64 (check zst) \n", + "\u001b[?25h\u001b[?25l\u001b[2K\u001b[0G[+] 0.0s\n", + "\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 0.1s\n", + "litex-hub/linux-64 ⣾ \n", + "litex-hub/noarch ⣾ \n", + "main/linux-64 ⣾ \n", + "main/noarch ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 0.2s\n", + "litex-hub/linux-64 ⣾ \n", + "litex-hub/noarch ⣾ \n", + "main/linux-64 ⣾ \n", + "main/noarch 4%\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Glitex-hub/noarch \n", + "main/noarch \n", + "[+] 0.3s\n", + "litex-hub/linux-64 ⣾ \n", + "main/linux-64 10%\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 0.4s\n", + "litex-hub/linux-64 ⣾ \n", + "main/linux-64 84%\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gmain/linux-64 \n", + "[+] 0.5s\n", + "litex-hub/linux-64 ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 0.6s\n", + "litex-hub/linux-64 ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 0.7s\n", + "litex-hub/linux-64 ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 0.8s\n", + "litex-hub/linux-64 54%\u001b[2K\u001b[1A\u001b[2K\u001b[0Glitex-hub/linux-64 \n", + "\u001b[?25h\n", + "Transaction\n", + "\n", + " Prefix: /content/conda-env\n", + "\n", + " Updating specs:\n", + "\n", + " - klayout\n", + "\n", + "\n", + " Package Version Build Channel Size\n", + "─────────────────────────────────────────────────────────────────────────────────────────\n", + " Install:\n", + "─────────────────────────────────────────────────────────────────────────────────────────\n", + "\n", + " \u001b[32m+ _libgcc_mutex \u001b[0m 0.1 main main 3kB\n", + " \u001b[32m+ libstdcxx-ng \u001b[0m 11.2.0 h1234567_1 main 6MB\n", + " \u001b[32m+ ld_impl_linux-64\u001b[0m 2.38 h1181459_1 main 749kB\n", + " \u001b[32m+ ca-certificates \u001b[0m 2024.3.11 h06a4308_0 main 137kB\n", + " \u001b[32m+ libgomp \u001b[0m 11.2.0 h1234567_1 main 573kB\n", + " \u001b[32m+ _openmp_mutex \u001b[0m 5.1 1_gnu main 21kB\n", + " \u001b[32m+ libgcc-ng \u001b[0m 11.2.0 h1234567_1 main 9MB\n", + " \u001b[32m+ yaml \u001b[0m 0.1.7 had09818_2 main 87kB\n", + " \u001b[32m+ libuuid \u001b[0m 1.41.5 h5eee18b_0 main 29kB\n", + " \u001b[32m+ gmp \u001b[0m 6.2.1 h295c915_3 main 822kB\n", + " \u001b[32m+ ncurses \u001b[0m 6.4 h6a678d5_0 main 1MB\n", + " \u001b[32m+ bzip2 \u001b[0m 1.0.8 h5eee18b_6 main 428kB\n", + " \u001b[32m+ libev \u001b[0m 4.33 h7f8727e_1 main 109kB\n", + " \u001b[32m+ c-ares \u001b[0m 1.19.1 h5eee18b_0 main 116kB\n", + " \u001b[32m+ libiconv \u001b[0m 1.16 h5eee18b_3 main 1MB\n", + " \u001b[32m+ libffi \u001b[0m 3.4.4 h6a678d5_1 main 154kB\n", + " \u001b[32m+ xz \u001b[0m 5.4.6 h5eee18b_1 main 717kB\n", + " \u001b[32m+ zlib \u001b[0m 1.2.13 h5eee18b_1 main 127kB\n", + " \u001b[32m+ openssl \u001b[0m 1.1.1w h7f8727e_0 main 4MB\n", + " \u001b[32m+ libxcb \u001b[0m 1.15 h7f8727e_0 main 623kB\n", + " \u001b[32m+ jpeg \u001b[0m 9e h5eee18b_1 main 281kB\n", + " \u001b[32m+ icu \u001b[0m 58.2 he6710b0_3 main 24MB\n", + " \u001b[32m+ expat \u001b[0m 2.6.2 h6a678d5_0 main 200kB\n", + " \u001b[32m+ libedit \u001b[0m 3.1.20230828 h5eee18b_0 main 196kB\n", + " \u001b[32m+ readline \u001b[0m 8.2 h5eee18b_0 main 468kB\n", + " \u001b[32m+ tk \u001b[0m 8.6.14 h39e8969_0 main 4MB\n", + " \u001b[32m+ pcre2 \u001b[0m 10.42 hebb0a14_1 main 3MB\n", + " \u001b[32m+ libpng \u001b[0m 1.6.39 h5eee18b_0 main 363kB\n", + " \u001b[32m+ libssh2 \u001b[0m 1.10.0 h37d81fd_2 main 312kB\n", + " \u001b[32m+ libnghttp2 \u001b[0m 1.52.0 ha637b67_1 main 717kB\n", + " \u001b[32m+ krb5 \u001b[0m 1.20.1 h568e23c_1 main 1MB\n", + " \u001b[32m+ sqlite \u001b[0m 3.45.3 h5eee18b_0 main 2MB\n", + " \u001b[32m+ ruby \u001b[0m 2.5.1 haf1161a_0 main 5MB\n", + " \u001b[32m+ libglib \u001b[0m 2.78.4 hdc74915_0 main 2MB\n", + " \u001b[32m+ freetype \u001b[0m 2.12.1 h4a9f257_0 main 972kB\n", + " \u001b[32m+ libcurl \u001b[0m 8.2.1 h91b91d3_0 main 386kB\n", + " \u001b[32m+ python \u001b[0m 3.7.16 h7a1cb2a_0 main 49MB\n", + " \u001b[32m+ wheel \u001b[0m 0.38.4 py37h06a4308_0 main 59kB\n", + " \u001b[32m+ glib-tools \u001b[0m 2.78.4 h6a678d5_0 main 113kB\n", + " \u001b[32m+ curl \u001b[0m 8.2.1 h37d81fd_0 main 89kB\n", + " \u001b[32m+ certifi \u001b[0m 2022.12.7 py37h06a4308_0 main 155kB\n", + " \u001b[32m+ libgit2 \u001b[0m 1.6.4 ha637b67_0 main 1MB\n", + " \u001b[32m+ setuptools \u001b[0m 65.6.3 py37h06a4308_0 main 1MB\n", + " \u001b[32m+ pip \u001b[0m 22.3.1 py37h06a4308_0 main 3MB\n", + " \u001b[32m+ glib \u001b[0m 2.78.4 h6a678d5_0 main 499kB\n", + " \u001b[32m+ gstreamer \u001b[0m 1.14.1 h5eee18b_1 main 2MB\n", + " \u001b[32m+ dbus \u001b[0m 1.13.18 hb2f20db_0 main 600kB\n", + " \u001b[32m+ gst-plugins-base\u001b[0m 1.14.1 h6a678d5_1 main 2MB\n", + " \u001b[32m+ libxml2 \u001b[0m 2.9.9 20220706_155948 litex-hub 1MB\n", + " \u001b[32m+ fontconfig \u001b[0m 2.13.0 h9420a91_0 main 298kB\n", + " \u001b[32m+ qt \u001b[0m 5.9.7 h5867ecd_1 main 90MB\n", + " \u001b[32m+ klayout \u001b[0m 0.28.17_212_gfa14afbbf 20240223_100318_py37 litex-hub 27MB\n", + "\n", + " Summary:\n", + "\n", + " Install: 52 packages\n", + "\n", + " Total download: 249MB\n", + "\n", + "─────────────────────────────────────────────────────────────────────────────────────────\n", + "\n", + "\n", + "\n", + "Transaction starting\n", + "\u001b[?25l\u001b[2K\u001b[0G[+] 0.0s\n", + "Downloading 0%\n", + "Extracting 0%\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 0.1s\n", + "Downloading (5) 0%\n", + "Extracting 0%\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 0.2s\n", + "Downloading (5) 0%\n", + "Extracting 0%\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 0.3s\n", + "Downloading (5) 0%\n", + "Extracting 0%\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 0.4s\n", + "Downloading (5) 0%\n", + "Extracting 0%\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G_libgcc_mutex 3.1kB @ 7.7kB/s 0.4s\n", + "[+] 0.5s\n", + "Downloading (5) 1%\n", + "Extracting (1) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gld_impl_linux-64 749.1kB @ 1.5MB/s 0.5s\n", + "ca-certificates 137.4kB @ 234.5kB/s 0.6s\n", + "libgomp 573.2kB @ 976.5kB/s 0.6s\n", + "[+] 0.6s\n", + "Downloading (5) 1%\n", + "Extracting (4) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 0.7s\n", + "Downloading (5) 2%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 0.8s\n", + "Downloading (5) 3%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Glibstdcxx-ng 6.4MB @ 7.5MB/s 0.9s\n", + "ncurses 1.2MB @ 1.3MB/s 0.5s\n", + "[+] 0.9s\n", + "Downloading (5) 4%\n", + "Extracting (5) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gc-ares 116.3kB @ 126.2kB/s 0.4s\n", + "[+] 1.0s\n", + "Downloading (5) 4%\n", + "Extracting (6) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gxz 716.9kB @ 698.4kB/s 0.4s\n", + "libxcb 623.5kB @ 573.9kB/s 0.5s\n", + "[+] 1.1s\n", + "Downloading (5) 5%\n", + "Extracting (7) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 1.2s\n", + "Downloading (5) 5%\n", + "Extracting (6) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gexpat 200.2kB @ 156.8kB/s 0.4s\n", + "[+] 1.3s\n", + "Downloading (5) 5%\n", + "Extracting (7) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Glibssh2 311.8kB @ 234.8kB/s 0.4s\n", + "tk 3.6MB @ 2.6MB/s 0.5s\n", + "[+] 1.4s\n", + "Downloading (5) 6%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 1.5s\n", + "Downloading (5) 6%\n", + "Extracting (8) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gsqlite 1.7MB @ 1.1MB/s 0.6s\n", + "[+] 1.6s\n", + "Downloading (5) 7%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 1.7s\n", + "Downloading (5) 7%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gwheel 58.7kB @ 33.3kB/s 0.5s\n", + "certifi 155.3kB @ 87.6kB/s 0.4s\n", + "[+] 1.8s\n", + "Downloading (5) 7%\n", + "Extracting (11) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 1.9s\n", + "Downloading (5) 7%\n", + "Extracting (11) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 2.0s\n", + "Downloading (5) 9%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gpip 2.8MB @ 1.4MB/s 0.6s\n", + "_openmp_mutex 20.8kB @ 10.0kB/s 0.3s\n", + "[+] 2.1s\n", + "Downloading (5) 9%\n", + "Extracting (12) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gfreetype 972.0kB @ 461.3kB/s 1.0s\n", + "[+] 2.2s\n", + "Downloading (5) 9%\n", + "Extracting (13) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gfontconfig 297.6kB @ 135.0kB/s 0.4s\n", + "[+] 2.3s\n", + "Downloading (5) 9%\n", + "Extracting (14) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Glibuuid 29.2kB @ 12.6kB/s 0.3s\n", + "dbus 600.2kB @ 253.2kB/s 0.8s\n", + "[+] 2.4s\n", + "Downloading (5) 9%\n", + "Extracting (15) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Glibev 108.9kB @ 44.9kB/s 0.3s\n", + "[+] 2.5s\n", + "Downloading (5) 9%\n", + "Extracting (16) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gzlib 127.1kB @ 50.3kB/s 0.4s\n", + "[+] 2.6s\n", + "Downloading (5) 9%\n", + "Extracting (17) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 2.7s\n", + "Downloading (5) 9%\n", + "Extracting (17) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 2.8s\n", + "Downloading (5) 11%\n", + "Extracting (17) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Glibcurl 386.4kB @ 137.3kB/s 0.4s\n", + "krb5 1.4MB @ 502.2kB/s 0.5s\n", + "[+] 2.9s\n", + "Downloading (5) 14%\n", + "Extracting (19) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gpcre2 3.3MB @ 1.2MB/s 0.6s\n", + "[+] 3.0s\n", + "Downloading (5) 18%\n", + "Extracting (19) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gcurl 88.8kB @ 28.9kB/s 0.5s\n", + "[+] 3.1s\n", + "Downloading (5) 19%\n", + "Extracting (20) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gicu 23.8MB @ 7.5MB/s 1.0s\n", + "[+] 3.2s\n", + "Downloading (5) 21%\n", + "Extracting (21) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 3.3s\n", + "Downloading (5) 21%\n", + "Extracting (21) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gglib 499.0kB @ 151.3kB/s 0.5s\n", + "[+] 3.4s\n", + "Downloading (5) 21%\n", + "Extracting (22) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 3.5s\n", + "Downloading (5) 23%\n", + "Extracting (21) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Glibxml2 1.4MB @ 395.5kB/s 0.7s\n", + "bzip2 427.5kB @ 121.0kB/s 0.5s\n", + "[+] 3.6s\n", + "Downloading (5) 25%\n", + "Extracting (23) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Glibgcc-ng 8.9MB @ 2.5MB/s 0.7s\n", + "readline 467.7kB @ 129.1kB/s 0.3s\n", + "[+] 3.7s\n", + "Downloading (5) 25%\n", + "Extracting (25) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 3.8s\n", + "Downloading (5) 26%\n", + "Extracting (25) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 3.9s\n", + "Downloading (5) 27%\n", + "Extracting (24) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gopenssl 4.0MB @ 1.0MB/s 0.7s\n", + "glib-tools 112.6kB @ 28.5kB/s 0.4s\n", + "[+] 4.0s\n", + "Downloading (5) 27%\n", + "Extracting (26) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Ggstreamer 1.7MB @ 415.6kB/s 0.5s\n", + "[+] 4.1s\n", + "Downloading (5) 28%\n", + "Extracting (27) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 4.2s\n", + "Downloading (5) 29%\n", + "Extracting (26) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 4.3s\n", + "Downloading (5) 31%\n", + "Extracting (26) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Glibiconv 1.4MB @ 327.5kB/s 0.5s\n", + "[+] 4.4s\n", + "Downloading (5) 34%\n", + "Extracting (25) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 4.5s\n", + "Downloading (5) 35%\n", + "Extracting (26) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 4.6s\n", + "Downloading (5) 38%\n", + "Extracting (26) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Glibglib 1.6MB @ 339.9kB/s 0.6s\n", + "[+] 4.7s\n", + "Downloading (5) 39%\n", + "Extracting (27) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gklayout 26.7MB @ 5.7MB/s 1.1s\n", + "[+] 4.8s\n", + "Downloading (5) 41%\n", + "Extracting (27) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 4.9s\n", + "Downloading (5) 41%\n", + "Extracting (27) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gruby 5.3MB @ 1.1MB/s 1.5s\n", + "[+] 5.0s\n", + "Downloading (5) 42%\n", + "Extracting (27) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gsetuptools 1.4MB @ 287.5kB/s 0.6s\n", + "libedit 195.8kB @ 38.9kB/s 1.1s\n", + "yaml 87.1kB @ 17.2kB/s 0.4s\n", + "[+] 5.1s\n", + "Downloading (5) 43%\n", + "Extracting (30) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gjpeg 281.4kB @ 54.3kB/s 0.5s\n", + "[+] 5.2s\n", + "Downloading (5) 43%\n", + "Extracting (31) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 5.3s\n", + "Downloading (5) 43%\n", + "Extracting (31) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 5.4s\n", + "Downloading (5) 43%\n", + "Extracting (31) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 5.5s\n", + "Downloading (5) 43%\n", + "Extracting (31) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Glibpng 362.6kB @ 65.6kB/s 0.5s\n", + "[+] 5.6s\n", + "Downloading (5) 43%\n", + "Extracting (30) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 5.7s\n", + "Downloading (5) 44%\n", + "Extracting (30) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Glibnghttp2 716.6kB @ 125.7kB/s 0.5s\n", + "[+] 5.8s\n", + "Downloading (5) 47%\n", + "Extracting (31) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 5.9s\n", + "Downloading (5) 48%\n", + "Extracting (31) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Glibffi 154.0kB @ 25.8kB/s 0.4s\n", + "[+] 6.0s\n", + "Downloading (5) 50%\n", + "Extracting (32) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 6.1s\n", + "Downloading (5) 51%\n", + "Extracting (32) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 6.2s\n", + "Downloading (5) 52%\n", + "Extracting (32) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Glibgit2 1.2MB @ 187.9kB/s 0.5s\n", + "[+] 6.3s\n", + "Downloading (4) 55%\n", + "Extracting (33) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Ggst-plugins-base 2.3MB @ 353.7kB/s 1.3s\n", + "[+] 6.4s\n", + "Downloading (3) 58%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Ggmp 822.4kB @ 127.9kB/s 0.5s\n", + "[+] 6.5s\n", + "Downloading (2) 61%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 6.6s\n", + "Downloading (2) 63%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 6.7s\n", + "Downloading (2) 64%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 6.8s\n", + "Downloading (2) 67%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 6.9s\n", + "Downloading (2) 69%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 7.0s\n", + "Downloading (2) 71%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 7.1s\n", + "Downloading (2) 74%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 7.2s\n", + "Downloading (2) 76%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 7.3s\n", + "Downloading (2) 78%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 7.4s\n", + "Downloading (2) 79%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 7.5s\n", + "Downloading (2) 81%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 7.6s\n", + "Downloading (2) 83%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gqt 90.0MB @ 11.7MB/s 2.7s\n", + "[+] 7.7s\n", + "Downloading (1) 85%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 7.8s\n", + "Downloading (1) 85%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 7.9s\n", + "Downloading (1) 86%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 8.0s\n", + "Downloading (1) 86%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 8.1s\n", + "Downloading (1) 87%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 8.2s\n", + "Downloading (1) 88%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 8.3s\n", + "Downloading (1) 89%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 8.4s\n", + "Downloading (1) 90%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 8.5s\n", + "Downloading (1) 91%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 8.6s\n", + "Downloading (1) 93%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 8.7s\n", + "Downloading (1) 95%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 8.8s\n", + "Downloading (1) 96%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 8.9s\n", + "Downloading (1) 98%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0Gpython 48.7MB @ 5.4MB/s 4.0s\n", + "[+] 9.0s\n", + "Downloading 100%\n", + "Extracting (36) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 9.1s\n", + "Downloading 100%\n", + "Extracting (36) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 9.2s\n", + "Downloading 100%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 9.3s\n", + "Downloading 100%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 9.4s\n", + "Downloading 100%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 9.5s\n", + "Downloading 100%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 9.6s\n", + "Downloading 100%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 9.7s\n", + "Downloading 100%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 9.8s\n", + "Downloading 100%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 9.9s\n", + "Downloading 100%\n", + "Extracting (35) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 10.0s\n", + "Downloading 100%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 10.1s\n", + "Downloading 100%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 10.2s\n", + "Downloading 100%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 10.3s\n", + "Downloading 100%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 10.4s\n", + "Downloading 100%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 10.5s\n", + "Downloading 100%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 10.6s\n", + "Downloading 100%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 10.7s\n", + "Downloading 100%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 10.8s\n", + "Downloading 100%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 10.9s\n", + "Downloading 100%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 11.0s\n", + "Downloading 100%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 11.1s\n", + "Downloading 100%\n", + "Extracting (34) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 11.2s\n", + "Downloading 100%\n", + "Extracting (33) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 11.3s\n", + "Downloading 100%\n", + "Extracting (33) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 11.4s\n", + "Downloading 100%\n", + "Extracting (33) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 11.5s\n", + "Downloading 100%\n", + "Extracting (33) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 11.6s\n", + "Downloading 100%\n", + "Extracting (33) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 11.7s\n", + "Downloading 100%\n", + "Extracting (33) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 11.8s\n", + "Downloading 100%\n", + "Extracting (33) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 11.9s\n", + "Downloading 100%\n", + "Extracting (33) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 12.0s\n", + "Downloading 100%\n", + "Extracting (33) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 12.1s\n", + "Downloading 100%\n", + "Extracting (33) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 12.2s\n", + "Downloading 100%\n", + "Extracting (33) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 12.3s\n", + "Downloading 100%\n", + "Extracting (33) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 12.4s\n", + "Downloading 100%\n", + "Extracting (32) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 12.5s\n", + "Downloading 100%\n", + "Extracting (32) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 12.6s\n", + "Downloading 100%\n", + "Extracting (32) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 12.7s\n", + "Downloading 100%\n", + "Extracting (32) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 12.8s\n", + "Downloading 100%\n", + "Extracting (32) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 12.9s\n", + "Downloading 100%\n", + "Extracting (32) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 13.0s\n", + "Downloading 100%\n", + "Extracting (32) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 13.1s\n", + "Downloading 100%\n", + "Extracting (32) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 13.2s\n", + "Downloading 100%\n", + "Extracting (32) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 13.3s\n", + "Downloading 100%\n", + "Extracting (31) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 13.4s\n", + "Downloading 100%\n", + "Extracting (31) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 13.5s\n", + "Downloading 100%\n", + "Extracting (31) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 13.6s\n", + "Downloading 100%\n", + "Extracting (31) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 13.7s\n", + "Downloading 100%\n", + "Extracting (30) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 13.8s\n", + "Downloading 100%\n", + "Extracting (30) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 13.9s\n", + "Downloading 100%\n", + "Extracting (30) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 14.0s\n", + "Downloading 100%\n", + "Extracting (30) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 14.1s\n", + "Downloading 100%\n", + "Extracting (29) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 14.2s\n", + "Downloading 100%\n", + "Extracting (29) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 14.3s\n", + "Downloading 100%\n", + "Extracting (29) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 14.4s\n", + "Downloading 100%\n", + "Extracting (29) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 14.5s\n", + "Downloading 100%\n", + "Extracting (29) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 14.6s\n", + "Downloading 100%\n", + "Extracting (28) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 14.7s\n", + "Downloading 100%\n", + "Extracting (28) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 14.8s\n", + "Downloading 100%\n", + "Extracting (28) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 14.9s\n", + "Downloading 100%\n", + "Extracting (28) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 15.0s\n", + "Downloading 100%\n", + "Extracting (28) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 15.1s\n", + "Downloading 100%\n", + "Extracting (28) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 15.2s\n", + "Downloading 100%\n", + "Extracting (28) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 15.3s\n", + "Downloading 100%\n", + "Extracting (27) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 15.4s\n", + "Downloading 100%\n", + "Extracting (27) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 15.5s\n", + "Downloading 100%\n", + "Extracting (27) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 15.6s\n", + "Downloading 100%\n", + "Extracting (27) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 15.7s\n", + "Downloading 100%\n", + "Extracting (26) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 15.8s\n", + "Downloading 100%\n", + "Extracting (26) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 15.9s\n", + "Downloading 100%\n", + "Extracting (25) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 16.0s\n", + "Downloading 100%\n", + "Extracting (24) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 16.1s\n", + "Downloading 100%\n", + "Extracting (24) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 16.2s\n", + "Downloading 100%\n", + "Extracting (24) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 16.3s\n", + "Downloading 100%\n", + "Extracting (24) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 16.4s\n", + "Downloading 100%\n", + "Extracting (23) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 16.5s\n", + "Downloading 100%\n", + "Extracting (22) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 16.6s\n", + "Downloading 100%\n", + "Extracting (22) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 16.7s\n", + "Downloading 100%\n", + "Extracting (22) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 16.8s\n", + "Downloading 100%\n", + "Extracting (22) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 16.9s\n", + "Downloading 100%\n", + "Extracting (22) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 17.0s\n", + "Downloading 100%\n", + "Extracting (22) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 17.1s\n", + "Downloading 100%\n", + "Extracting (22) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 17.2s\n", + "Downloading 100%\n", + "Extracting (22) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 17.3s\n", + "Downloading 100%\n", + "Extracting (22) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 17.4s\n", + "Downloading 100%\n", + "Extracting (22) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 17.5s\n", + "Downloading 100%\n", + "Extracting (22) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 17.6s\n", + "Downloading 100%\n", + "Extracting (22) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 17.7s\n", + "Downloading 100%\n", + "Extracting (21) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 17.8s\n", + "Downloading 100%\n", + "Extracting (21) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 17.9s\n", + "Downloading 100%\n", + "Extracting (20) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 18.0s\n", + "Downloading 100%\n", + "Extracting (19) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 18.1s\n", + "Downloading 100%\n", + "Extracting (19) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 18.2s\n", + "Downloading 100%\n", + "Extracting (19) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 18.3s\n", + "Downloading 100%\n", + "Extracting (18) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 18.4s\n", + "Downloading 100%\n", + "Extracting (18) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 18.5s\n", + "Downloading 100%\n", + "Extracting (17) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 18.6s\n", + "Downloading 100%\n", + "Extracting (17) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 18.7s\n", + "Downloading 100%\n", + "Extracting (17) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 18.8s\n", + "Downloading 100%\n", + "Extracting (17) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 18.9s\n", + "Downloading 100%\n", + "Extracting (16) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 19.0s\n", + "Downloading 100%\n", + "Extracting (16) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 19.1s\n", + "Downloading 100%\n", + "Extracting (16) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 19.2s\n", + "Downloading 100%\n", + "Extracting (15) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 19.3s\n", + "Downloading 100%\n", + "Extracting (15) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 19.4s\n", + "Downloading 100%\n", + "Extracting (15) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 19.5s\n", + "Downloading 100%\n", + "Extracting (14) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 19.6s\n", + "Downloading 100%\n", + "Extracting (13) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 19.7s\n", + "Downloading 100%\n", + "Extracting (13) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 19.8s\n", + "Downloading 100%\n", + "Extracting (12) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 19.9s\n", + "Downloading 100%\n", + "Extracting (12) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 20.0s\n", + "Downloading 100%\n", + "Extracting (11) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 20.1s\n", + "Downloading 100%\n", + "Extracting (11) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 20.2s\n", + "Downloading 100%\n", + "Extracting (11) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 20.3s\n", + "Downloading 100%\n", + "Extracting (11) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 20.4s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 20.5s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 20.6s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 20.7s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 20.8s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 20.9s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 21.0s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 21.1s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 21.2s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 21.3s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 21.4s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 21.5s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 21.6s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 21.7s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 21.8s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 21.9s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 22.0s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 22.1s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 22.2s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 22.3s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 22.4s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 22.5s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 22.6s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 22.7s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 22.8s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 22.9s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 23.0s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 23.1s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 23.2s\n", + "Downloading 100%\n", + "Extracting (10) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 23.3s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 23.4s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 23.5s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 23.6s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 23.7s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 23.8s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 23.9s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 24.0s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 24.1s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 24.2s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 24.3s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 24.4s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 24.5s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 24.6s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 24.7s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 24.8s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 24.9s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 25.0s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 25.1s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 25.2s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 25.3s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 25.4s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 25.5s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 25.6s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 25.7s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 25.8s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 25.9s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 26.0s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 26.1s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 26.2s\n", + "Downloading 100%\n", + "Extracting (9) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 26.3s\n", + "Downloading 100%\n", + "Extracting (8) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 26.4s\n", + "Downloading 100%\n", + "Extracting (8) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 26.5s\n", + "Downloading 100%\n", + "Extracting (8) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 26.6s\n", + "Downloading 100%\n", + "Extracting (7) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 26.7s\n", + "Downloading 100%\n", + "Extracting (7) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 26.8s\n", + "Downloading 100%\n", + "Extracting (7) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 26.9s\n", + "Downloading 100%\n", + "Extracting (6) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 27.0s\n", + "Downloading 100%\n", + "Extracting (6) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 27.1s\n", + "Downloading 100%\n", + "Extracting (6) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 27.2s\n", + "Downloading 100%\n", + "Extracting (6) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 27.3s\n", + "Downloading 100%\n", + "Extracting (6) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 27.4s\n", + "Downloading 100%\n", + "Extracting (6) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 27.5s\n", + "Downloading 100%\n", + "Extracting (5) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 27.6s\n", + "Downloading 100%\n", + "Extracting (5) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 27.7s\n", + "Downloading 100%\n", + "Extracting (5) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 27.8s\n", + "Downloading 100%\n", + "Extracting (5) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 27.9s\n", + "Downloading 100%\n", + "Extracting (5) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 28.0s\n", + "Downloading 100%\n", + "Extracting (5) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 28.1s\n", + "Downloading 100%\n", + "Extracting (4) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 28.2s\n", + "Downloading 100%\n", + "Extracting (4) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 28.3s\n", + "Downloading 100%\n", + "Extracting (4) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 28.4s\n", + "Downloading 100%\n", + "Extracting (4) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 28.5s\n", + "Downloading 100%\n", + "Extracting (4) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 28.6s\n", + "Downloading 100%\n", + "Extracting (4) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 28.7s\n", + "Downloading 100%\n", + "Extracting (4) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 28.8s\n", + "Downloading 100%\n", + "Extracting (4) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 28.9s\n", + "Downloading 100%\n", + "Extracting (4) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 29.0s\n", + "Downloading 100%\n", + "Extracting (4) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 29.1s\n", + "Downloading 100%\n", + "Extracting (4) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 29.2s\n", + "Downloading 100%\n", + "Extracting (4) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 29.3s\n", + "Downloading 100%\n", + "Extracting (4) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 29.4s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 29.5s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 29.6s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 29.7s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 29.8s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 29.9s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 30.0s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 30.1s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 30.2s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 30.3s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 30.4s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 30.5s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 30.6s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 30.7s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 30.8s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 30.9s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 31.0s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 31.1s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 31.2s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 31.3s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 31.4s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 31.5s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 31.6s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 31.7s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 31.8s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 31.9s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 32.0s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 32.1s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 32.2s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 32.3s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 32.4s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 32.5s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 32.6s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 32.7s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 32.8s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 32.9s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 33.0s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 33.1s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 33.2s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 33.3s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 33.4s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 33.5s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 33.6s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 33.7s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 33.8s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 33.9s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 34.0s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 34.1s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 34.2s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 34.3s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 34.4s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 34.5s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 34.6s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 34.7s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 34.8s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 34.9s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 35.0s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 35.1s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 35.2s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 35.3s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 35.4s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 35.5s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 35.6s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 35.7s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 35.8s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 35.9s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 36.0s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 36.1s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 36.2s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 36.3s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 36.4s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 36.5s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 36.6s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 36.7s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 36.8s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 36.9s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 37.0s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 37.1s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 37.2s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 37.3s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 37.4s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 37.5s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 37.6s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 37.7s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 37.8s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 37.9s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 38.0s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 38.1s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 38.2s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 38.3s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 38.4s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 38.5s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 38.6s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 38.7s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 38.8s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 38.9s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 39.0s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 39.1s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 39.2s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 39.3s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 39.4s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 39.5s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 39.6s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 39.7s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 39.8s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 39.9s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 40.0s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 40.1s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 40.2s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 40.3s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 40.4s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 40.5s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 40.6s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 40.7s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 40.8s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 40.9s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 41.0s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 41.1s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 41.2s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 41.3s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 41.4s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 41.5s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 41.6s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 41.7s\n", + "Downloading 100%\n", + "Extracting (3) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 41.8s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 41.9s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 42.0s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 42.1s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 42.2s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 42.3s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 42.4s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 42.5s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 42.6s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 42.7s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 42.8s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 42.9s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 43.0s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 43.1s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 43.2s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 43.3s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 43.4s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 43.5s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 43.6s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 43.7s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 43.8s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 43.9s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 44.0s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 44.1s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 44.2s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 44.3s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 44.4s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 44.5s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 44.6s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 44.7s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 44.8s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 44.9s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 45.0s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 45.1s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 45.2s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 45.3s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 45.4s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 45.5s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 45.6s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 45.7s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 45.8s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 45.9s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 46.0s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 46.1s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 46.2s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 46.3s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 46.4s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 46.5s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 46.6s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 46.7s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 46.8s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 46.9s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 47.0s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 47.1s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 47.2s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 47.3s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 47.4s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 47.5s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 47.6s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 47.7s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 47.8s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 47.9s\n", + "Downloading 100%\n", + "Extracting (2) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 48.0s\n", + "Downloading 100%\n", + "Extracting (1) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 48.1s\n", + "Downloading 100%\n", + "Extracting (1) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 48.2s\n", + "Downloading 100%\n", + "Extracting (1) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 48.3s\n", + "Downloading 100%\n", + "Extracting (1) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 48.4s\n", + "Downloading 100%\n", + "Extracting (1) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 48.5s\n", + "Downloading 100%\n", + "Extracting (1) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 48.6s\n", + "Downloading 100%\n", + "Extracting (1) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 48.7s\n", + "Downloading 100%\n", + "Extracting (1) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 48.8s\n", + "Downloading 100%\n", + "Extracting (1) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 48.9s\n", + "Downloading 100%\n", + "Extracting (1) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 49.0s\n", + "Downloading 100%\n", + "Extracting (1) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 49.1s\n", + "Downloading 100%\n", + "Extracting (1) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 49.2s\n", + "Downloading 100%\n", + "Extracting (1) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 49.3s\n", + "Downloading 100%\n", + "Extracting (1) ⣾ \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G[+] 49.4s\n", + "Downloading 100%\n", + "Extracting 100%\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[0G\u001b[?25hLinking _libgcc_mutex-0.1-main\n", + "Linking libstdcxx-ng-11.2.0-h1234567_1\n", + "Linking ld_impl_linux-64-2.38-h1181459_1\n", + "Linking ca-certificates-2024.3.11-h06a4308_0\n", + "Linking libgomp-11.2.0-h1234567_1\n", + "Linking _openmp_mutex-5.1-1_gnu\n", + "Linking libgcc-ng-11.2.0-h1234567_1\n", + "Linking yaml-0.1.7-had09818_2\n", + "Linking libuuid-1.41.5-h5eee18b_0\n", + "Linking gmp-6.2.1-h295c915_3\n", + "Linking ncurses-6.4-h6a678d5_0\n", + "Linking bzip2-1.0.8-h5eee18b_6\n", + "Linking libev-4.33-h7f8727e_1\n", + "Linking c-ares-1.19.1-h5eee18b_0\n", + "Linking libiconv-1.16-h5eee18b_3\n", + "Linking libffi-3.4.4-h6a678d5_1\n", + "Linking xz-5.4.6-h5eee18b_1\n", + "Linking zlib-1.2.13-h5eee18b_1\n", + "Linking openssl-1.1.1w-h7f8727e_0\n", + "Linking libxcb-1.15-h7f8727e_0\n", + "Linking jpeg-9e-h5eee18b_1\n", + "Linking icu-58.2-he6710b0_3\n", + "Linking expat-2.6.2-h6a678d5_0\n", + "Linking libedit-3.1.20230828-h5eee18b_0\n", + "Linking readline-8.2-h5eee18b_0\n", + "Linking tk-8.6.14-h39e8969_0\n", + "Linking pcre2-10.42-hebb0a14_1\n", + "Linking libpng-1.6.39-h5eee18b_0\n", + "Linking libssh2-1.10.0-h37d81fd_2\n", + "Linking libnghttp2-1.52.0-ha637b67_1\n", + "Linking krb5-1.20.1-h568e23c_1\n", + "Linking sqlite-3.45.3-h5eee18b_0\n", + "Linking ruby-2.5.1-haf1161a_0\n", + "Linking libglib-2.78.4-hdc74915_0\n", + "Linking freetype-2.12.1-h4a9f257_0\n", + "Linking libcurl-8.2.1-h91b91d3_0\n", + "Linking python-3.7.16-h7a1cb2a_0\n", + "Linking wheel-0.38.4-py37h06a4308_0\n", + "Linking glib-tools-2.78.4-h6a678d5_0\n", + "Linking curl-8.2.1-h37d81fd_0\n", + "Linking certifi-2022.12.7-py37h06a4308_0\n", + "Linking libgit2-1.6.4-ha637b67_0\n", + "Linking setuptools-65.6.3-py37h06a4308_0\n", + "Linking pip-22.3.1-py37h06a4308_0\n", + "Linking glib-2.78.4-h6a678d5_0\n", + "Linking gstreamer-1.14.1-h5eee18b_1\n", + "Linking dbus-1.13.18-hb2f20db_0\n", + "Linking gst-plugins-base-1.14.1-h6a678d5_1\n", + "Linking libxml2-2.9.9-20220706_155948\n", + "Linking fontconfig-2.13.0-h9420a91_0\n", + "Linking qt-5.9.7-h5867ecd_1\n", + "Linking klayout-0.28.17_212_gfa14afbbf-20240223_100318_py37\n", + "\n", + "Transaction finished\n", + "\n", + "To activate this environment, use:\n", + "\n", + " micromamba activate /content/conda-env\n", + "\n", + "Or to execute a single command in this environment, use:\n", + "\n", + " micromamba run -p /content/conda-env mycommand\n", + "\n" + ] + } + ], + "source": [ + "# Setup the environment for the OpenFASOC GDSFactory generator\n", + "# You only need to run this block once!\n", + "\n", + "# Clone OpenFASoC\n", + "!git clone https://github.com/idea-fasoc/OpenFASOC\n", + "# Install python dependencies\n", + "!pip install sky130\n", + "!pip install gf180 prettyprinttree svgutils\n", + "!pip install gdsfactory==7.7.0\n", + "\n", + "import pathlib\n", + "import os\n", + "# Install KLayout (via conda)\n", + "!curl -Ls https://micro.mamba.pm/api/micromamba/linux-64/latest | tar -xvj bin/micromamba\n", + "conda_prefix_path = pathlib.Path('conda-env')\n", + "CONDA_PREFIX = str(conda_prefix_path.resolve())\n", + "%env CONDA_PREFIX={CONDA_PREFIX}\n", + "\n", + "!bin/micromamba create --yes --prefix $CONDA_PREFIX\n", + "# Install from the litex-hub channel\n", + "!bin/micromamba install --yes --prefix $CONDA_PREFIX \\\n", + " --channel litex-hub \\\n", + " --channel main \\\n", + " klayout\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "B6dO3W3m8TQZ" + }, + "source": [ + "#### 1.2. Adding the `klayout` binary to the system path, then goto the GLayout directory\n", + "**You need to run this each time you restart the kernel**" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "Izl4QURo8TQa", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "40d0a93b-7d99-410f-8fd6-ff25a830f507" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "env: CONDA_PREFIX=/content/conda-env\n", + "env: PATH=/opt/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/tools/node/bin:/tools/google-cloud-sdk/bin:/content/conda-env/bin\n", + "/content/OpenFASOC/openfasoc/generators/glayout\n" + ] + } + ], + "source": [ + "# Setup the environment for the OpenFASOC GDSFactory generator\n", + "\n", + "# Adding micro-mamba binary directory to the PATH\n", + "# This directory contains Klayout\n", + "import pathlib\n", + "import os\n", + "conda_prefix_path = pathlib.Path('conda-env')\n", + "CONDA_PREFIX = str(conda_prefix_path.resolve())\n", + "%env CONDA_PREFIX={CONDA_PREFIX}\n", + "# Add conda packages to the PATH\n", + "PATH = os.environ['PATH']\n", + "%env PATH={PATH}:{CONDA_PREFIX}/bin\n", + "\n", + "%cd /content/OpenFASOC/openfasoc/generators/glayout" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e-sbwZb_8TQb" + }, + "source": [ + "#### 1.3. Importing Libraries and Utility Functions" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "Nc7wGAz68TQb" + }, + "outputs": [], + "source": [ + "from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk as sky130\n", + "from glayout.flow.pdk.gf180_mapped import gf180_mapped_pdk as gf180\n", + "import gdstk\n", + "import svgutils.transform as sg\n", + "import IPython.display\n", + "from IPython.display import clear_output\n", + "import ipywidgets as widgets\n", + "\n", + "# Redirect all outputs here\n", + "hide = widgets.Output()\n", + "\n", + "def display_gds(gds_file, scale = 3):\n", + " # Generate an SVG image\n", + " top_level_cell = gdstk.read_gds(gds_file).top_level()[0]\n", + " top_level_cell.write_svg('out.svg')\n", + " # Scale the image for displaying\n", + " fig = sg.fromfile('out.svg')\n", + " fig.set_size((str(float(fig.width) * scale), str(float(fig.height) * scale)))\n", + " fig.save('out.svg')\n", + "\n", + " # Display the image\n", + " IPython.display.display(IPython.display.SVG('out.svg'))\n", + "\n", + "def display_component(component, scale = 3):\n", + " # Save to a GDS file\n", + " with hide:\n", + " component.write_gds(\"out.gds\")\n", + " display_gds('out.gds', scale)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ywJ1Xc5K395z" + }, + "source": [ + "# Introduction to GLayout\n", + "\n", + "## Overview\n", + "\n", + "This document provides a detailed tutorial on using the GLayout API.\n", + "\n", + "## Prerequisites\n", + "\n", + "Ensure that you have the following installed:\n", + "- Python environment with access to GLayout API.\n", + "- GDSFactory package for handling generic layout components.\n", + "- A PDK (Process Design Kit) appropriate for the technology node you're working on\n", + "\n", + "## GLayers\n", + "Processes often have a shared set of layers. We access these layers using generic layers.\n", + "We support\n", + "1. n well\n", + "2. n/p select\n", + "3. diffusion\n", + "4. poly\n", + "5. metal 1\n", + "6. metal 2\n", + "7. metal 3\n", + "8. Mcon\n", + "9. via 1\n", + "10. via 2\n", + "\n", + "As you can see in the following code examples we use `pdk.get_glayer()` in order to get a tuple associated with a layer.\n", + "\n", + "This tuple associated the generic layer with a PDK's layer." + ] + }, + { + "cell_type": "code", + "source": [ + "sky130_met1 = sky130.get_glayer(\"met1\")\n", + "gf180_met1 = gf180.get_glayer(\"met1\")\n", + "print(sky130_met1)\n", + "print(gf180_met1)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "doswEocb2Wyg", + "outputId": "46af4bc6-0fde-4f09-9055-80246ef750e6" + }, + "execution_count": 10, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "(67, 20)\n", + "(34, 0)\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## GRules\n", + "GRules is how you access layout rules for a layer.\n", + "\n", + "### Examples\n", + "1. Remember the via example? In that example we wanted to access the minimum width of a via\n", + "2. In the via example we want to find the minimum enclosure of a via inside of a metal contact.\n", + "3. When you want to space two metal tracks\n" + ], + "metadata": { + "id": "8e_EKnZD6MLY" + } + }, + { + "cell_type": "code", + "source": [ + "# Minimum width for a via example\n", + "min_width_via1 = sky130.get_grule('via1')['min_width']\n", + "print(f\"min width for via: {min_width_via1}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "gKlMrabr7Skw", + "outputId": "6ffc85c1-e72f-4418-cb53-435a89582a78" + }, + "execution_count": 26, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "min width for via: 0.17\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Minimum Enclosure Example\n", + "# Lets do it for sky 130\n", + "min_enc_met1 = sky130.get_grule('via1','met1')['min_enclosure']\n", + "min_enc_met2 = sky130.get_grule('via1','met2')['min_enclosure']\n", + "print(\"Sky130\")\n", + "print(f\"min enclosure metal1 and via: {min_enc_met1}\")\n", + "print(f\"min enclosure metal2 and via: {min_enc_met2}\")\n", + "\n", + "# Lets do the same for gf180\n", + "min_enc_met1 = gf180.get_grule('via1','met1')['min_enclosure']\n", + "min_enc_met2 = gf180.get_grule('via1','met2')['min_enclosure']\n", + "print(\"Gf180\")\n", + "print(f\"min enclosure metal1 and via: {min_enc_met1}\")\n", + "print(f\"min enclosure metal1 and via: {min_enc_met2}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "GaSgRFeR9A0Q", + "outputId": "e5b62b08-81d6-412a-d64c-5a37f9669cb8" + }, + "execution_count": 27, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Sky130\n", + "min enclosure metal1 and via: 0.0\n", + "min enclosure metal2 and via: 0.06\n", + "Gf180\n", + "min enclosure metal1 and via: 0.12\n", + "min enclosure metal1 and via: 0.12\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Minimum Spacing Example\n", + "min_met1_spacing = sky130.get_grule('met1','met1')['min_separation']\n", + "print(f\"min spacing between metal: {min_met1_spacing}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "EODOFqGq9DIr", + "outputId": "9c75276e-a09c-4de3-9612-98458f379573" + }, + "execution_count": 30, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "min spacing between metal: 0.17\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Drawing layouts\n", + "We draw rectangles for layers using gdsfactory\n", + "For now, lets use the rules we just used to make a very simple metal rectangle. Here we have an example where we draw a simple metal track." + ], + "metadata": { + "id": "HBKDwtNG94OC" + } + }, + { + "cell_type": "code", + "source": [ + "from glayout.flow.pdk.mappedpdk import MappedPDK\n", + "from gdsfactory import Component\n", + "from gdsfactory.components import rectangle\n", + "\n", + "def makeMet1Rectangle(pdk: MappedPDK, length):\n", + " met1 = pdk.get_glayer(\"met1\")\n", + " met1_width = pdk.get_grule(\"met1\")[\"min_width\"]\n", + " top_level = Component(name=\"metal_track\")\n", + " top_level << rectangle(size=(length, met1_width), layer=met1)\n", + " return top_level\n", + "\n", + "metalTrack = makeMet1Rectangle(sky130,3)\n", + "metalTrack.write_gds('metaltrack.gds')\n", + "display_gds('metaltrack.gds',scale=20)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 134 + }, + "id": "pfvH6W3T-US7", + "outputId": "002b6605-ce98-4e2a-f35d-b147ce762c8f" + }, + "execution_count": 41, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "\u001b[32m2024-06-19 19:37:26.658\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mgdsfactory.component\u001b[0m:\u001b[36m_write_library\u001b[0m:\u001b[36m1851\u001b[0m - \u001b[1mWrote to 'metaltrack.gds'\u001b[0m\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "image/svg+xml": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Using and Manipulating Components\n", + "In the previous section, we made a component that just consists of a metal track. Now lets use this component to make other components. This is called hierarchal design. Here we introduce the `evaluate_bbox` and `movey`\n" + ], + "metadata": { + "id": "HZdmO-LOAVwV" + } + }, + { + "cell_type": "code", + "source": [ + "from glayout.flow.pdk.util.comp_utils import evaluate_bbox\n", + "\n", + "def makeAdjacentMetal1Tracks(pdk: MappedPDK, length):\n", + " track1 = makeMet1Rectangle(pdk, length)\n", + " track2 = makeMet1Rectangle(pdk, length)\n", + " top_level = Component(name=\"adjacent_metal_tracks\")\n", + " track1_ref = top_level << track1\n", + " track2_ref = top_level << track2\n", + " width = evaluate_bbox(track1)[1] # gets the dimension on the y axis\n", + " track2_ref.movey(width + pdk.get_grule('met1','met1')['min_separation'])\n", + " return top_level\n", + "\n", + "adjMetalTrack = makeAdjacentMetal1Tracks(sky130,3)\n", + "adjMetalTrack.write_gds('adjmetaltrack.gds')\n", + "display_gds('adjmetaltrack.gds',scale=20)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 202 + }, + "id": "9uhSsJk5BQoT", + "outputId": "e2568734-0706-4c4d-e338-017d9f2df70f" + }, + "execution_count": 48, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "\u001b[32m2024-06-19 20:00:37.397\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mgdsfactory.component\u001b[0m:\u001b[36m_write_library\u001b[0m:\u001b[36m1851\u001b[0m - \u001b[1mWrote to 'adjmetaltrack.gds'\u001b[0m\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "image/svg+xml": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Primitives\n", + "GLayout provides many primitives that you can use instead of doing everything from the bottom up. You can find all of the primitives [here](https://github.com/idea-fasoc/OpenFASOC/tree/main/openfasoc/generators/glayout/glayout/flow/primitives)\n", + "I will place a pmos and a nmos side by side in the example below:" + ], + "metadata": { + "id": "2ltByHycDMf2" + } + }, + { + "cell_type": "code", + "source": [ + "from glayout.flow.primitives.fet import pmos\n", + "from glayout.flow.primitives.fet import nmos\n", + "\n", + "def placeTwoTrasistors(pdk):\n", + " pfet = pmos(pdk)\n", + " nfet = nmos(pdk)\n", + " top_level = Component()\n", + " pfet_ref = top_level << pfet\n", + " nfet_ref = top_level << nfet\n", + " compSep = pdk.util_max_metal_seperation()\n", + " nfet_ref.movex(compSep + evaluate_bbox(pfet)[0])\n", + " return top_level\n", + "\n", + "twoTransistors = placeTwoTrasistors(sky130)\n", + "twoTransistors.write_gds('twotransistors.gds')\n", + "display_gds('twotransistors.gds',scale=2)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 296 + }, + "id": "LDRd54mjEfpz", + "outputId": "ef17c6b1-4d2a-45e5-dcaa-59fb9a24eb4c" + }, + "execution_count": 53, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":15: UserWarning: Unnamed cells, 3 in 'Unnamed_2f8a1aac'\n", + " twoTransistors.write_gds('twotransistors.gds')\n", + "\u001b[32m2024-06-19 20:04:32.294\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mgdsfactory.component\u001b[0m:\u001b[36m_write_library\u001b[0m:\u001b[36m1851\u001b[0m - \u001b[1mWrote to 'twotransistors.gds'\u001b[0m\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "image/svg+xml": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Routing and Ports\n", + "How do we connect the ports of transistors. In this section we'll make a current mirror" + ], + "metadata": { + "id": "Y2DYHIcdHUpw" + } + }, + { + "cell_type": "code", + "source": [ + "from glayout.flow.routing.straight_route import straight_route\n", + "from glayout.flow.routing.c_route import c_route\n", + "\n", + "def currentMirror(pdk: MappedPDK):\n", + " currMirrComp = Component()\n", + " pfet_ref = pmos(pdk, with_substrate_tap=False, with_dummy=(False, True))\n", + " pfet_mir = pmos(pdk, with_substrate_tap=False, with_dummy=(True, False))\n", + " cref_ref = currMirrComp << pfet_ref\n", + " cmir_ref = currMirrComp << pfet_mir\n", + " cref_ref.movex(evaluate_bbox(pfet_mir)[0] + pdk.util_max_metal_seperation())\n", + " currMirrComp << straight_route(pdk, cref_ref.ports[\"multiplier_0_source_E\"], cmir_ref.ports[\"multiplier_0_source_E\"])\n", + " currMirrComp << straight_route(pdk, cref_ref.ports[\"multiplier_0_gate_E\"], cmir_ref.ports[\"multiplier_0_gate_E\"])\n", + " currMirrComp << c_route(pdk, cref_ref.ports[\"multiplier_0_drain_E\"], cref_ref.ports[\"multiplier_0_gate_E\"])\n", + " return currMirrComp\n", + "\n", + "currentMirror(sky130).write_gds(\"cmirror_example.gds\")\n", + "display_gds(\"cmirror_example.gds\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 324 + }, + "id": "hBw2fYboQvMD", + "outputId": "6923efe5-2408-4f14-f3e7-2e7f1f8a78db" + }, + "execution_count": 57, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":16: UserWarning: Unnamed cells, 3 in 'Unnamed_79c3280c'\n", + " currentMirror(sky130).write_gds(\"cmirror_example.gds\")\n", + "\u001b[32m2024-06-19 20:52:07.345\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mgdsfactory.component\u001b[0m:\u001b[36m_write_library\u001b[0m:\u001b[36m1851\u001b[0m - \u001b[1mWrote to 'cmirror_example.gds'\u001b[0m\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "image/svg+xml": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + }, + "metadata": {} + } + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + }, + "vscode": { + "interpreter": { + "hash": "397704579725e15f5c7cb49fe5f0341eb7531c82d19f2c29d197e8b64ab5776b" + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file From 722d3db78d9d2f045a4786f379cb0890a6ebebdf Mon Sep 17 00:00:00 2001 From: sakib <107497530+srpathen@users.noreply.github.com> Date: Mon, 24 Jun 2024 14:17:56 -0400 Subject: [PATCH 4/8] Change workflow script to downgrade to numpy version 1.23.3 --- .github/workflows/glayout_sky130.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/glayout_sky130.yml b/.github/workflows/glayout_sky130.yml index 804087e31..436431f88 100644 --- a/.github/workflows/glayout_sky130.yml +++ b/.github/workflows/glayout_sky130.yml @@ -41,6 +41,8 @@ jobs: cp ./.github/scripts/test_glayout_ci.py ./openfasoc/generators/glayout/. &&\ cd ./openfasoc/generators/glayout &&\ pip3 install gdsfactory==7.7.0 prettyprint prettyprinttree gdstk &&\ + python3 -m pip uninstall numpy -y &&\ + python3 -m pip install numpy==1.23.3 &&\ python3 test_glayout_ci.py --component opamp " && exit_code=$? | tee -a glayout.log if [ $? -ne 0 ]; then exit 1; fi @@ -62,6 +64,8 @@ jobs: cp ./.github/scripts/test_glayout_ci.py ./openfasoc/generators/glayout/. &&\ cd ./openfasoc/generators/glayout &&\ pip3 install gdsfactory==7.7.0 prettyprint prettyprinttree gdstk &&\ + python3 -m pip uninstall numpy -y &&\ + python3 -m pip install numpy==1.23.3 &&\ python3 test_glayout_ci.py --component pmos " && exit_code=$? | tee -a glayout.log if [ $? -ne 0 ]; then exit 1; fi @@ -82,6 +86,8 @@ jobs: cp ./.github/scripts/test_glayout_ci.py ./openfasoc/generators/glayout/. &&\ cd ./openfasoc/generators/glayout &&\ pip3 install gdsfactory==7.7.0 prettyprint prettyprinttree gdstk &&\ + python3 -m pip uninstall numpy -y &&\ + python3 -m pip install numpy==1.23.3 &&\ python3 test_glayout_ci.py --component nmos " && exit_code=$? | tee -a glayout.log if [ $? -ne 0 ]; then exit 1; fi @@ -102,6 +108,8 @@ jobs: cp ./.github/scripts/test_glayout_ci.py ./openfasoc/generators/glayout/. &&\ cd ./openfasoc/generators/glayout &&\ pip3 install gdsfactory==7.7.0 prettyprint prettyprinttree gdstk &&\ + python3 -m pip uninstall numpy -y &&\ + python3 -m pip install numpy==1.23.3 &&\ python3 test_glayout_ci.py --component diff_pair " && exit_code=$? | tee -a glayout.log if [ $? -ne 0 ]; then exit 1; fi @@ -122,6 +130,8 @@ jobs: cp ./.github/scripts/test_glayout_ci.py ./openfasoc/generators/glayout/. &&\ cd ./openfasoc/generators/glayout &&\ pip3 install gdsfactory==7.7.0 prettyprint prettyprinttree gdstk &&\ + python3 -m pip uninstall numpy -y &&\ + python3 -m pip install numpy==1.23.3 &&\ python3 test_glayout_ci.py --component current_mirror " && exit_code=$? | tee -a glayout.log if [ $? -ne 0 ]; then exit 1; fi From 9c1ef572f23a5812176c919b35588e8d3c109fdf Mon Sep 17 00:00:00 2001 From: sakib <107497530+srpathen@users.noreply.github.com> Date: Mon, 24 Jun 2024 14:27:35 -0400 Subject: [PATCH 5/8] Change opamp_sim script to downgrade to numpy version 1.23.3 --- .github/workflows/glayout_opamp_sim.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/glayout_opamp_sim.yml b/.github/workflows/glayout_opamp_sim.yml index cf9eb9fcf..ad510a23f 100644 --- a/.github/workflows/glayout_opamp_sim.yml +++ b/.github/workflows/glayout_opamp_sim.yml @@ -41,6 +41,8 @@ jobs: pip3 install -r requirements.txt &&\ cd ./openfasoc/generators/glayout/tapeout/tapeout_and_RL/ &&\ pip3 install prettyprint prettyprinttree gdstk &&\ + python3 -m pip uninstall numpy -y &&\ + python3 -m pip install numpy==1.23.3 &&\ python3 test_glayout_ci.py --component opamp_parametric " && exit_code=$? | tee -a glayout.log if [ $? -ne 0 ]; then exit 1; fi From 1a8b2385a498e3c4b4f164f6092c9901efc538be Mon Sep 17 00:00:00 2001 From: sakib <107497530+srpathen@users.noreply.github.com> Date: Wed, 26 Jun 2024 11:51:48 -0400 Subject: [PATCH 6/8] Adding convo parser --- .../glayout/glayout/llm/convoparser.py | 265 ++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 openfasoc/generators/glayout/glayout/llm/convoparser.py diff --git a/openfasoc/generators/glayout/glayout/llm/convoparser.py b/openfasoc/generators/glayout/glayout/llm/convoparser.py new file mode 100644 index 000000000..d45ed0f1e --- /dev/null +++ b/openfasoc/generators/glayout/glayout/llm/convoparser.py @@ -0,0 +1,265 @@ +class Command: + def __init__(self, type: str): + self.type = type + def type(self): + return self.type + def changeParamDependency(self, param, newparam): + return + def changeCompDependency(self, comp, newcomp): + return + +class Import: + def __init__(self, line): + self.line = line + self.type = "import" + self.parseLine() + def parseLine(self): + words = self.line.split(" ") + self.importFile = words[1] + def regenCommand(self): + return f"import {self.importFile}" + +class Param(Command): + def __init__(self, line): + self.line = line + self.type = "create" + self.parseLine() + def parseLine(self): + words = self.line.split(" ") + self.paramType = words[2] + self.name = words[5] + def regenCommand(self): + return f"create a {self.paramType} parameter called {self.name}" + def changeParamDependency(self, param, newparam): + if self.name == param: + self.name = newparam + +# has parameter dependencies +class Place(Command): + def __init__(self, line): + self.line = line + self.type = "place" + self.parseLine() + def parseLine(self): + words = self.line.split(" ") + self.compType = words[2] + if self.compType == "interdigitated": + self.compType += " "+words[3] + self.compName = words[5] + else: + self.compName = words[4] + withIndex = self.line.find(" with ") + if withIndex > -1: + keyValues = self.line[self.line.find(" with ")+len(" with "):] + self.keyValues = parseKeyValues(keyValues) + else: + self.keyValues = None + def changeParamDependency(self, param, newparam): + if self.keyValues == None: + return + for key in self.keyValues: + if self.keyValues[key] == param: + self.keyValues[key] = newparam + if "kwargs" in self.keyValues: + for key in self.keyValues["kwargs"]: + if self.keyValues["kwargs"][key] == param: + self.keyValues["kwargs"][key] = newparam + def changeCompDependency(self, comp, newcomp): + if self.compName == comp: + self.compName = newcomp + def regenCommand(self): + string = f"place a {self.compType} called {self.compName}" + if self.keyValues != None: + string += " with " + regenKeyValues(self.keyValues) + return string + +# Has component dependencies +class Move(Command): + def __init__(self, line): + self.line = line + self.type = "move" + self.parseLine() + def parseLine(self): + words = self.line.split(" ") + self.comp1 = words[1] + self.comp2 = words[-1] + self.moveType = " ".join(words[2:-1]) + def changeCompDependency(self, comp, newcomp): + if self.comp1 == comp: + self.comp1 = newcomp + if self.comp2 == comp: + self.comp2 = newcomp + def regenCommand(self): + return f"move {self.comp1} {self.moveType} {self.comp2}" + +# Has component dependencies, and might have parameter dependencies +class Route(Command): + def __init__(self, line): + self.line = line + self.type = "route" + self.parseLine() + def parseLine(self): + words = self.line.split(" ") + self.port1 = words[2] + self.port2 = words[4] + self.routeType = words[6] + withIndex = self.line.find(" with ") + if withIndex > -1: + keyValues = self.line[self.line.find(" with ")+len(" with "):] + self.keyValues = parseKeyValues(keyValues) + else: + self.keyValues = None + def changeParamDependency(self, param, newparam): + if self.keyValues == None: + return + for key in self.keyValues: + if self.keyValues[key] == param: + self.keyValues[key] = newparam + if "kwargs" in self.keyValues: + for key in self.keyValues["kwargs"]: + if self.keyValues["kwargs"][key] == param: + self.keyValues["kwargs"][key] = newparam + def changeCompDependency(self, comp, newcomp): + comp1 = "" + comp2 = "" + if self.port1.find("_") != -1: + comp1 = self.port1[:self.port1.find("_")] + if self.port2.find("_") != -1: + comp2 = self.port2[:self.port2.find("_")] + if comp1 == comp: + self.port1 = newcomp+self.port1[self.port1.find("_"):] + if comp2 == comp: + self.port2 = newcomp+self.port2[self.port2.find("_"):] + def regenCommand(self): + string = f"route between {self.port1} and {self.port2}" + if self.keyValues != None: + string += " with " + regenKeyValues(self.keyValues) + return string + +class Comment(Command): + def __init__(self, line): + self.line = line + self.type = "comment" + def regenCommand(self): + return self.line + + +def parseKeyValues(line: str): + key = "" + value = "" + keyToken = True + keyValue = dict() + kwargStart = False + tupleStart = False + for ch in line: + if ch == "{": + kwargStart = True + elif ch == "(": + tupleStart = True + elif ch == "}": + kwargStart = False + value = parseKwarg(value) + elif ch == ")": + tupleStart = False + value = parseTuple(value) + elif ch == "=": + keyToken = False + elif (ch == " " or ch == ",") and (not kwargStart and not tupleStart): + if key != "" and value != "": + keyValue[key] = value + keyToken = True + key = "" + value = "" + else: + if keyToken: + key = key + ch + else: + value = value + ch + keyValue[key]= value + return keyValue + +def parseKwarg(line: str): + trimmed = line.replace(' ','') + words = trimmed.split(",") + kwargs = dict() + for word in words: + keyVal = word.split(":") + kwargs[keyVal[0][1:-1]] = keyVal[1] + return kwargs + +def parseTuple(line: str): + trimmed = line.replace(' ','') + words = trimmed.split(",") + return (words[0], words[1]) + +def regenKeyValues(keyValues: dict): + keyVals = "" + for key in keyValues: + if key == "kwargs": + value = regenKwargs(keyValues[key]) + elif type(keyValues[key]) == tuple: + value = regenTuple(keyValues[key]) + else: + value = keyValues[key] + keyVals += f"{key}={value}, " + keyVals = keyVals[:-2] + return keyVals + +def regenKwargs(kwargs: dict): + kwarg = "{" + for arg in kwargs: + kwarg += f"\'{arg}\': {kwargs[arg]}, " + kwarg = kwarg[:-2] + kwarg += "}" + return kwarg + +def regenTuple(tuple): + return f"({tuple[0]},{tuple[1]})" + +class Convo: + def __init__(self, compName): + self.compName = compName + self.commands = [] + def addCommand(self, command): + self.commands.append(command) + def changeParam(self, param, newparam): + for command in self.commands: + command.changeParamDependency(param, newparam) + def changeComp(self, comp, newcomp): + for command in self.commands: + command.changeCompDependency(comp, newcomp) + def unparametrize(self, param, value): + for index in range(len(self.commands)): + if self.commands[index].type == "create": + if self.commands[index].name == param: + del self.commands[index] + break + self.changeParam(param, value) + + def regen(self): + str = self.compName + "\n" + for command in self.commands: + str += command.regenCommand() + "\n" + str = str[:-1] + return str + +class ConvoParser: + def __init__(self, filename: str): + self.fileContents = open(filename).read() + self.readContents() + def readContents(self): + commClassMap = {"import":Import, "create":Param, "place":Place, "move": Move, "route":Route} + lines = self.fileContents.split('\n') + self.convo = Convo(lines[0]) + for line in lines[1:]: + commandType = line.split(" ")[0] + if commandType in commClassMap: + self.convo.addCommand(commClassMap[commandType](line)) + elif line[0] == "#": + self.convo.addCommand(Comment(line)) + +convo = ConvoParser("syntax_data/convos/CascodeCommonSourceInterdigitated.convo").convo +convo.changeComp("CascodeCommonSource", "ccs") +convo.changeParam("width", "widthCS") +convo.unparametrize("fingers", "1") +print(convo.regen()) \ No newline at end of file From e78c38959ba0cd72fb1d392e1fa4e34028d31ea7 Mon Sep 17 00:00:00 2001 From: sakib <107497530+srpathen@users.noreply.github.com> Date: Fri, 28 Jun 2024 12:00:40 -0400 Subject: [PATCH 7/8] Update numpy version for workflow scripts to numpy version 1.23.5 --- .github/workflows/glayout_opamp_sim.yml | 2 +- .github/workflows/glayout_sky130.yml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/glayout_opamp_sim.yml b/.github/workflows/glayout_opamp_sim.yml index ad510a23f..856a0c51a 100644 --- a/.github/workflows/glayout_opamp_sim.yml +++ b/.github/workflows/glayout_opamp_sim.yml @@ -42,7 +42,7 @@ jobs: cd ./openfasoc/generators/glayout/tapeout/tapeout_and_RL/ &&\ pip3 install prettyprint prettyprinttree gdstk &&\ python3 -m pip uninstall numpy -y &&\ - python3 -m pip install numpy==1.23.3 &&\ + python3 -m pip install numpy==1.23.5 &&\ python3 test_glayout_ci.py --component opamp_parametric " && exit_code=$? | tee -a glayout.log if [ $? -ne 0 ]; then exit 1; fi diff --git a/.github/workflows/glayout_sky130.yml b/.github/workflows/glayout_sky130.yml index 436431f88..b2fb0f489 100644 --- a/.github/workflows/glayout_sky130.yml +++ b/.github/workflows/glayout_sky130.yml @@ -42,7 +42,7 @@ jobs: cd ./openfasoc/generators/glayout &&\ pip3 install gdsfactory==7.7.0 prettyprint prettyprinttree gdstk &&\ python3 -m pip uninstall numpy -y &&\ - python3 -m pip install numpy==1.23.3 &&\ + python3 -m pip install numpy==1.23.5 &&\ python3 test_glayout_ci.py --component opamp " && exit_code=$? | tee -a glayout.log if [ $? -ne 0 ]; then exit 1; fi @@ -65,7 +65,7 @@ jobs: cd ./openfasoc/generators/glayout &&\ pip3 install gdsfactory==7.7.0 prettyprint prettyprinttree gdstk &&\ python3 -m pip uninstall numpy -y &&\ - python3 -m pip install numpy==1.23.3 &&\ + python3 -m pip install numpy==1.23.5 &&\ python3 test_glayout_ci.py --component pmos " && exit_code=$? | tee -a glayout.log if [ $? -ne 0 ]; then exit 1; fi @@ -87,7 +87,7 @@ jobs: cd ./openfasoc/generators/glayout &&\ pip3 install gdsfactory==7.7.0 prettyprint prettyprinttree gdstk &&\ python3 -m pip uninstall numpy -y &&\ - python3 -m pip install numpy==1.23.3 &&\ + python3 -m pip install numpy==1.23.5 &&\ python3 test_glayout_ci.py --component nmos " && exit_code=$? | tee -a glayout.log if [ $? -ne 0 ]; then exit 1; fi @@ -109,7 +109,7 @@ jobs: cd ./openfasoc/generators/glayout &&\ pip3 install gdsfactory==7.7.0 prettyprint prettyprinttree gdstk &&\ python3 -m pip uninstall numpy -y &&\ - python3 -m pip install numpy==1.23.3 &&\ + python3 -m pip install numpy==1.23.5 &&\ python3 test_glayout_ci.py --component diff_pair " && exit_code=$? | tee -a glayout.log if [ $? -ne 0 ]; then exit 1; fi @@ -131,7 +131,7 @@ jobs: cd ./openfasoc/generators/glayout &&\ pip3 install gdsfactory==7.7.0 prettyprint prettyprinttree gdstk &&\ python3 -m pip uninstall numpy -y &&\ - python3 -m pip install numpy==1.23.3 &&\ + python3 -m pip install numpy==1.23.5 &&\ python3 test_glayout_ci.py --component current_mirror " && exit_code=$? | tee -a glayout.log if [ $? -ne 0 ]; then exit 1; fi From 72efa96bd2fc464c486aab03c7375117ad0d47cd Mon Sep 17 00:00:00 2001 From: sakib <107497530+srpathen@users.noreply.github.com> Date: Fri, 28 Jun 2024 12:58:23 -0400 Subject: [PATCH 8/8] Refactor convo_parser and add DRC and LVS integration for convo generation --- .../Command.py} | 130 ++---------------- .../glayout/llm/convo_parser/convoparser.py | 88 ++++++++++++ .../glayout/llm/convo_parser/parse_utils.py | 71 ++++++++++ .../glayout/glayout/llm/parser_test.py | 7 + 4 files changed, 175 insertions(+), 121 deletions(-) rename openfasoc/generators/glayout/glayout/llm/{convoparser.py => convo_parser/Command.py} (57%) create mode 100644 openfasoc/generators/glayout/glayout/llm/convo_parser/convoparser.py create mode 100644 openfasoc/generators/glayout/glayout/llm/convo_parser/parse_utils.py create mode 100644 openfasoc/generators/glayout/glayout/llm/parser_test.py diff --git a/openfasoc/generators/glayout/glayout/llm/convoparser.py b/openfasoc/generators/glayout/glayout/llm/convo_parser/Command.py similarity index 57% rename from openfasoc/generators/glayout/glayout/llm/convoparser.py rename to openfasoc/generators/glayout/glayout/llm/convo_parser/Command.py index d45ed0f1e..4caf997be 100644 --- a/openfasoc/generators/glayout/glayout/llm/convoparser.py +++ b/openfasoc/generators/glayout/glayout/llm/convo_parser/Command.py @@ -1,3 +1,5 @@ +from parse_utils import parseKeyValues, parseKwarg, parseTuple, regenKeyValues, regenKwargs, regenTuple + class Command: def __init__(self, type: str): self.type = type @@ -142,124 +144,10 @@ def __init__(self, line): self.type = "comment" def regenCommand(self): return self.line - - -def parseKeyValues(line: str): - key = "" - value = "" - keyToken = True - keyValue = dict() - kwargStart = False - tupleStart = False - for ch in line: - if ch == "{": - kwargStart = True - elif ch == "(": - tupleStart = True - elif ch == "}": - kwargStart = False - value = parseKwarg(value) - elif ch == ")": - tupleStart = False - value = parseTuple(value) - elif ch == "=": - keyToken = False - elif (ch == " " or ch == ",") and (not kwargStart and not tupleStart): - if key != "" and value != "": - keyValue[key] = value - keyToken = True - key = "" - value = "" - else: - if keyToken: - key = key + ch - else: - value = value + ch - keyValue[key]= value - return keyValue - -def parseKwarg(line: str): - trimmed = line.replace(' ','') - words = trimmed.split(",") - kwargs = dict() - for word in words: - keyVal = word.split(":") - kwargs[keyVal[0][1:-1]] = keyVal[1] - return kwargs - -def parseTuple(line: str): - trimmed = line.replace(' ','') - words = trimmed.split(",") - return (words[0], words[1]) - -def regenKeyValues(keyValues: dict): - keyVals = "" - for key in keyValues: - if key == "kwargs": - value = regenKwargs(keyValues[key]) - elif type(keyValues[key]) == tuple: - value = regenTuple(keyValues[key]) - else: - value = keyValues[key] - keyVals += f"{key}={value}, " - keyVals = keyVals[:-2] - return keyVals - -def regenKwargs(kwargs: dict): - kwarg = "{" - for arg in kwargs: - kwarg += f"\'{arg}\': {kwargs[arg]}, " - kwarg = kwarg[:-2] - kwarg += "}" - return kwarg - -def regenTuple(tuple): - return f"({tuple[0]},{tuple[1]})" - -class Convo: - def __init__(self, compName): - self.compName = compName - self.commands = [] - def addCommand(self, command): - self.commands.append(command) - def changeParam(self, param, newparam): - for command in self.commands: - command.changeParamDependency(param, newparam) - def changeComp(self, comp, newcomp): - for command in self.commands: - command.changeCompDependency(comp, newcomp) - def unparametrize(self, param, value): - for index in range(len(self.commands)): - if self.commands[index].type == "create": - if self.commands[index].name == param: - del self.commands[index] - break - self.changeParam(param, value) - - def regen(self): - str = self.compName + "\n" - for command in self.commands: - str += command.regenCommand() + "\n" - str = str[:-1] - return str - -class ConvoParser: - def __init__(self, filename: str): - self.fileContents = open(filename).read() - self.readContents() - def readContents(self): - commClassMap = {"import":Import, "create":Param, "place":Place, "move": Move, "route":Route} - lines = self.fileContents.split('\n') - self.convo = Convo(lines[0]) - for line in lines[1:]: - commandType = line.split(" ")[0] - if commandType in commClassMap: - self.convo.addCommand(commClassMap[commandType](line)) - elif line[0] == "#": - self.convo.addCommand(Comment(line)) - -convo = ConvoParser("syntax_data/convos/CascodeCommonSourceInterdigitated.convo").convo -convo.changeComp("CascodeCommonSource", "ccs") -convo.changeParam("width", "widthCS") -convo.unparametrize("fingers", "1") -print(convo.regen()) \ No newline at end of file + +class Newline(Command): + def __init__(self): + self.type = "newline" + def regenCommand(self): + return "" + \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/llm/convo_parser/convoparser.py b/openfasoc/generators/glayout/glayout/llm/convo_parser/convoparser.py new file mode 100644 index 000000000..64acf0e9c --- /dev/null +++ b/openfasoc/generators/glayout/glayout/llm/convo_parser/convoparser.py @@ -0,0 +1,88 @@ +from Command import Import, Param, Place, Move, Route, Comment, Newline +from validate_synthetic_data import run_all_tests, instantiate_convo +from glayout.flow.pdk.mappedpdk import MappedPDK +import tempfile + +class Convo: + def __init__(self, compName): + self.compName = compName + self.commands = [] + self.parameters = dict() + self.components = dict() + + def addParam(self, param, type, line): + self.parameters[param]= (type, line) + + def addComp(self, comp, type, line): + self.components[comp] = (type, line) + + def addCommand(self, command): + self.commands.append(command) + + def changeParam(self, param, newparam): + for command in self.commands: + command.changeParamDependency(param, newparam) + old = self.parameters[param] + del self.parameters[param] + self.parameters[newparam] = old + + def changeComp(self, comp, newcomp): + for command in self.commands: + command.changeCompDependency(comp, newcomp) + old = self.components[comp] + del self.components[comp] + self.parameters[newcomp] = old + + def unparametrize(self, param, value): + del self.commands[self.parameters[param][1]] + self.changeParam(param, value) + del self.parameters[param] + + def regen(self): + str = self.compName + "\n" + for command in self.commands: + str += command.regenCommand() + "\n" + str = str[:-2] + return str + + def runDRC(self, pdk: MappedPDK): + temp = tempfile.NamedTemporaryFile() + temp.write(self.regen()) + component = instantiate_convo(pdk, temp.name, return_component=True) + pdk.drc_magic(component, component.name) + + def run_LVSandPEX(self, pdk, netlist): + temp = tempfile.NamedTemporaryFile() + temp.write(self.regen()) + component = instantiate_convo(pdk, temp.name, return_component=True) + pdk.lvs_netgen(component, component.name, copy_intermediate_files=True, netlist=netlist) + +class ConvoParser: + def __init__(self, filename: str): + self.fileContents = open(filename).read() + self.readContents() + + def readContents(self): + commClassMap = {"import":Import, "create":Param, "place":Place, "move": Move, "route":Route} + lines = self.fileContents.split('\n') + self.convo = Convo(lines[0]) + + lineIndex = 0 + for line in lines[1:]: + commandType = line.split(" ")[0] + + if commandType in commClassMap: + command = commClassMap[commandType](line) + self.convo.addCommand(command) + if commandType == "create": + self.convo.addParam(command.name, command.paramType, lineIndex) + elif commandType == "place": + self.convo.addComp(command.compName, command.compType, lineIndex) + + elif len(line) > 0 and line[0] == "#": + self.convo.addCommand(Comment(line)) + + elif line == "": + self.convo.addCommand(Newline()) + + lineIndex += 1 diff --git a/openfasoc/generators/glayout/glayout/llm/convo_parser/parse_utils.py b/openfasoc/generators/glayout/glayout/llm/convo_parser/parse_utils.py new file mode 100644 index 000000000..566bd8f39 --- /dev/null +++ b/openfasoc/generators/glayout/glayout/llm/convo_parser/parse_utils.py @@ -0,0 +1,71 @@ +def parseKeyValues(line: str): + key = "" + value = "" + keyToken = True + keyValue = dict() + kwargStart = False + tupleStart = False + for ch in line: + if ch == "{": + kwargStart = True + elif ch == "(": + tupleStart = True + elif ch == "}": + kwargStart = False + value = parseKwarg(value) + elif ch == ")": + tupleStart = False + value = parseTuple(value) + elif ch == "=": + keyToken = False + elif (ch == " " or ch == ",") and (not kwargStart and not tupleStart): + if key != "" and value != "": + keyValue[key] = value + keyToken = True + key = "" + value = "" + else: + if keyToken: + key = key + ch + else: + value = value + ch + keyValue[key]= value + return keyValue + +def parseKwarg(line: str): + trimmed = line.replace(' ','') + words = trimmed.split(",") + kwargs = dict() + for word in words: + keyVal = word.split(":") + kwargs[keyVal[0][1:-1]] = keyVal[1] + return kwargs + +def parseTuple(line: str): + trimmed = line.replace(' ','') + words = trimmed.split(",") + return (words[0], words[1]) + +def regenKeyValues(keyValues: dict): + keyVals = "" + for key in keyValues: + if key == "kwargs": + value = regenKwargs(keyValues[key]) + elif type(keyValues[key]) == tuple: + value = regenTuple(keyValues[key]) + else: + value = keyValues[key] + keyVals += f"{key}={value}, " + keyVals = keyVals[:-2] + return keyVals + +def regenKwargs(kwargs: dict): + kwarg = "{" + for arg in kwargs: + kwarg += f"\'{arg}\': {kwargs[arg]}, " + kwarg = kwarg[:-2] + kwarg += "}" + return kwarg + +def regenTuple(tuple): + return f"({tuple[0]},{tuple[1]})" \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/llm/parser_test.py b/openfasoc/generators/glayout/glayout/llm/parser_test.py new file mode 100644 index 000000000..bc40b72f5 --- /dev/null +++ b/openfasoc/generators/glayout/glayout/llm/parser_test.py @@ -0,0 +1,7 @@ +import sys,os +sys.path.append('convo_parser') + +from convo_parser.convoparser import Convo, ConvoParser + +convo = ConvoParser("syntax_data/convos/CurrentMirrorNtype.convo").convo +print(convo.regen()) \ No newline at end of file