diff --git a/osaca/create_db_entry.py b/osaca/create_db_entry.py new file mode 100755 index 0000000..956b07e --- /dev/null +++ b/osaca/create_db_entry.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python3 + +import os +import sys + +from ruamel import yaml + + +def add_entry_to_db(arch: str, entry): + """Adds entry to the user database in ~/.osaca/data + + Args: + arch: string representation of the architecture as abbreviation. + Database for this architecture must already exist. + entry: DB entry which will be added. Should consist at best out of + 'name', 'operand(s)' ('register', 'memory', 'immediate', 'identifier', ...), + 'throughput', 'latency', 'port_pressure'. + """ + # load yaml + arch = arch.lower() + filepath = os.path.join(os.path.expanduser('~/.osaca/data/', arch + '.yml')) + assert os.path.exists(filepath) + with open(filepath, 'r') as f: + data = yaml.load(f, Loader=yaml.Loader) + # check parameter of entry + if 'name' not in entry: + raise ValueError('No name for instruction specified. No import possible') + if 'operands' not in entry: + entry['operands'] = None + if 'throughput' not in entry: + entry['throughput'] = None + if 'latency' not in entry: + entry['latency'] = None + if 'port_pressure' not in entry: + entry['port_pressure'] = None + data['instruction_forms'].append(entry) + __dump_data_to_yaml(filepath, data) + + +def add_entries_to_db(arch: str, entries: list) -> None: + """Adds entries to the user database in ~/.osaca/data + + Args: + arch: string representation of the architecture as abbreviation. + Database for this architecture must already exist. + entries: :class:`list` of DB entries which will be added. Should consist at best out of + 'name', 'operand(s)' ('register', 'memory', 'immediate', 'identifier', ...), + 'throughput', 'latency', 'port_pressure'. + """ + # load yaml + arch = arch.lower() + filepath = os.path.join(os.path.expanduser('~/.osaca/data/', arch + '.yml')) + assert os.path.exists(filepath) + with open(filepath, 'r') as f: + data = yaml.load(f, Loader=yaml.Loader) + # check parameter of entry and append it to list + for entry in entries: + if 'name' not in entry: + print( + 'No name for instruction \n\t{}\nspecified. No import possible'.format(entry), + file=sys.stderr, + ) + # remove entry from list + entries.remove(entry) + continue + if 'operands' not in entry: + entry['operands'] = None + if 'throughput' not in entry: + entry['throughput'] = None + if 'latency' not in entry: + entry['latency'] = None + if 'port_pressure' not in entry: + entry['port_pressure'] = None + data['instruction_forms'].append(entry) + __dump_data_to_yaml(filepath, data) + + +def __dump_data_to_yaml(filepath, data): + # first add 'normal' meta data in the right order (no ordered dict yet) + meta_data = dict(data) + del meta_data['instruction_forms'] + del meta_data['port_model_scheme'] + with open(filepath, 'w') as f: + yaml.dump(meta_data, f, allow_unicode=True) + with open(filepath, 'a') as f: + # now add port model scheme in |-scheme for better readability + yaml.dump( + {'port_model_scheme': data['port_model_scheme']}, + f, + allow_unicode=True, + default_style='|', + ) + # finally, add instruction forms + yaml.dump({'instruction_forms': data['instruction_forms']}, f, allow_unicode=True) diff --git a/osaca/data/csx.yml b/osaca/data/csx.yml index 8a3f400..c728017 100644 --- a/osaca/data/csx.yml +++ b/osaca/data/csx.yml @@ -103,8 +103,8 @@ instruction_forms: index: ~ scale: 1 throughput: 0.5 - latency: ~ # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.25, 0.0, 0.25, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.25, 0.25, 0.33333] + latency: ~ # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.25, 0.0, 0.25, 0.5, 0.5, 0.5, 0.5, 0.0, 0.25, 0.25, 0.0] - name: ja operands: - class: 'identifier' @@ -194,8 +194,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 7.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] + latency: 7.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] - name: vaddpd operands: - class: "memory" @@ -208,8 +208,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 7.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] + latency: 7.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] - name: vaddsd operands: - class: "register" @@ -266,8 +266,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] - name: vfmadd213pd operands: - class: "memory" @@ -280,8 +280,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] - name: vfmadd231pd operands: - class: "memory" @@ -294,8 +294,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] - name: vfmadd231pd operands: - class: "memory" @@ -308,8 +308,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] - name: vfmadd132pd operands: - class: "memory" @@ -322,8 +322,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] - name: vfmadd132pd operands: @@ -337,8 +337,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] - name: vmulsd operands: - class: "register" @@ -384,8 +384,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 7.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] + latency: 7.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] - name: vmulpd operands: @@ -399,8 +399,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 7.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] + latency: 7.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] - name: vmovapd operands: - class: "memory" @@ -411,8 +411,8 @@ instruction_forms: - class: "register" name: "xmm" throughput: 0.5 - latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] + latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] - name: vmovapd operands: - class: "register" @@ -423,8 +423,8 @@ instruction_forms: index: "gpr" scale: 1 throughput: 1.0 - latency: 2.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.0, 0.33333, 0.0, 1.0, 0.0, 0.0, 0.33333] + latency: 2.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 1.0, 0.0, 0.0, 0.0] - name: vmovapd operands: - class: "memory" @@ -435,8 +435,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] + latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] - name: vmovapd operands: - class: "memory" @@ -447,8 +447,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] + latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] - name: vmovapd operands: - class: "register" @@ -459,8 +459,8 @@ instruction_forms: index: "gpr" scale: 1 throughput: 1.0 - latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.0, 0.33333, 0.0, 1.0, 0.0, 0.0, 0.33333] + latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 1.0, 0.0, 0.0, 0.0] - name: vmovapd operands: - class: "register" @@ -471,8 +471,8 @@ instruction_forms: index: "gpr" scale: 1 throughput: 1.0 - latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.0, 0.33333, 0.0, 1.0, 0.0, 0.0, 0.33333] + latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 1.0, 0.0, 0.0, 0.0] - name: vmovupd operands: - class: "register" @@ -483,8 +483,8 @@ instruction_forms: index: "gpr" scale: 1 throughput: 1.0 - latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.0, 0.33333, 0.0, 1.0, 0.0, 0.0, 0.33333] + latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 1.0, 0.0, 0.0, 0.0] - name: vmovupd operands: - class: "register" @@ -495,8 +495,8 @@ instruction_forms: index: "gpr" scale: 1 throughput: 1.0 - latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.0, 0.33333, 0.0, 1.0, 0.0, 0.0, 0.33333] + latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 1.0, 0.0, 0.0, 0.0] - name: vmovupd operands: - class: "memory" @@ -507,8 +507,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] + latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] - name: vmovupd operands: - class: "memory" @@ -519,6 +519,6 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] + latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] diff --git a/osaca/data/zen1.yml b/osaca/data/zen1.yml index 85ccf59..362fcbf 100644 --- a/osaca/data/zen1.yml +++ b/osaca/data/zen1.yml @@ -365,7 +365,7 @@ instruction_forms: - class: "register" name: "xmm" throughput: 0.5 - latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + latency: 8.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D port_pressure: [0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5] - name: vmulpd operands: @@ -379,7 +379,7 @@ instruction_forms: - class: "register" name: "xmm" throughput: 0.5 - latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + latency: 8.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D port_pressure: [0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5] - name: vmulpd operands: @@ -404,7 +404,7 @@ instruction_forms: - class: "register" name: "ymm" throughput: 1.0 - latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + latency: 9.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D port_pressure: [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0] - name: vmulpd operands: @@ -418,7 +418,7 @@ instruction_forms: - class: "register" name: "ymm" throughput: 1.0 - latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + latency: 9.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D port_pressure: [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0] - name: vmovapd operands: @@ -430,7 +430,7 @@ instruction_forms: - class: "register" name: "xmm" throughput: 0.5 - latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + latency: 3.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5] - name: vmovapd operands: @@ -442,7 +442,7 @@ instruction_forms: index: "gpr" scale: 1 throughput: 1.0 - latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + latency: 4.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 1.0, 0.5, 1.0] - name: vmovapd operands: @@ -454,7 +454,7 @@ instruction_forms: - class: "register" name: "ymm" throughput: 1.0 - latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + latency: 5.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0] - name: vmovapd operands: @@ -466,7 +466,7 @@ instruction_forms: - class: "register" name: "ymm" throughput: 1.0 - latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + latency: 5.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0] - name: vmovapd operands: @@ -478,7 +478,7 @@ instruction_forms: index: "gpr" scale: 1 throughput: 2.0 - latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + latency: 3.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 2.0, 1.0, 2.0] - name: vmovapd operands: @@ -490,7 +490,7 @@ instruction_forms: index: "gpr" scale: 1 throughput: 2.0 - latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + latency: 3.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 2.0, 1.0, 2.0] - name: vmovaps operands: @@ -502,7 +502,7 @@ instruction_forms: index: "gpr" scale: 1 throughput: 1.0 - latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + latency: 4.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 1.0, 0.5, 1.0] - name: vmovaps operands: @@ -514,7 +514,7 @@ instruction_forms: index: "gpr" scale: 1 throughput: 1.0 - latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + latency: 4.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 1.0, 0.5, 1.0] - name: vmovupd operands: @@ -526,7 +526,7 @@ instruction_forms: index: "gpr" scale: 1 throughput: 2.0 - latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + latency: 3.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 2.0, 1.0, 2.0] - name: vmovupd operands: @@ -538,7 +538,7 @@ instruction_forms: index: "gpr" scale: 1 throughput: 2.0 - latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + latency: 3.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 2.0, 1.0, 2.0] - name: vmovupd operands: @@ -550,7 +550,7 @@ instruction_forms: - class: "register" name: "ymm" throughput: 2.0 - latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + latency: 5.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 2.0, 1.0, 2.0] - name: vmovupd operands: @@ -562,5 +562,5 @@ instruction_forms: - class: "register" name: "ymm" throughput: 2.0 - latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + latency: 5.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 2.0, 1.0, 2.0]