Compare commits

..

2 Commits

Author SHA1 Message Date
1123794b1a Update bundle and remove debug messages from production build
Signed-off-by: Egor Savkin <es@m-labs.hk>
2025-02-03 15:50:05 +08:00
a945e7a95b Add warnings for the phaser being obstacled by next card 2025-02-03 15:16:53 +08:00
13 changed files with 113 additions and 119 deletions

View File

@ -88,10 +88,6 @@ We accept all major currencies including USD, EUR, RMB, GBP, BTC and XMR.
Yes, however processing credit cards is expensive and you need to cover the costs. 4\% card processing fee applies for payment by credit card in Hong Kong dollars. 7\% card processing and exchange fee applies for payment by credit card in US dollars. Yes, however processing credit cards is expensive and you need to cover the costs. 4\% card processing fee applies for payment by credit card in Hong Kong dollars. 7\% card processing and exchange fee applies for payment by credit card in US dollars.
##### I have overpaid or double-paid an invoice. What should I do?
Contact sb@m-labs.hk and we will return the excess funds within a few business days. You shall pay all banking and credit card charges incurred.
##### We are a distributor. Can we have exclusive rights to your products? ##### We are a distributor. Can we have exclusive rights to your products?
Exclusivity is subject to contractual minimum order volumes determined at our discretion, but generally exceeding USD 300,000.00 per year for most countries. Exclusivity is subject to contractual minimum order volumes determined at our discretion, but generally exceeding USD 300,000.00 per year for most countries.

View File

@ -1,11 +1,3 @@
- title: "Distributed quantum computing across an optical network link"
authors: "D. Main, P. Drmota, D. P. Nadlinger, E. M. Ainley, A. Agrawal, B. C. Nichol, R. Srinivas, G. Araneda & D. M. Lucas"
links:
- name: "Nature (2025)"
path: "https://www.nature.com/articles/s41586-024-08404-x"
- name: "Announcement"
path: "https://www.ox.ac.uk/news/2025-02-06-first-distributed-quantum-algorithm-brings-quantum-supercomputers-closer"
- title: "Fast quantum logic gates with trapped-ion qubits" - title: "Fast quantum logic gates with trapped-ion qubits"
authors: "V.M. Schäfer, C.J. Ballance, K. Thirumalai, L.J. Stephenson, T.G. Ballance, A.M. Steane & D.M. Lucas" authors: "V.M. Schäfer, C.J. Ballance, K. Thirumalai, L.J. Stephenson, T.G. Ballance, A.M. Steane & D.M. Lucas"
links: links:

View File

@ -139,17 +139,6 @@ We welcome inquiries from research groups of all sizes.<br>[See what has been fu
<a href="https://github.com/OxfordIonTrapGroup/ndscan" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a> <a href="https://github.com/OxfordIonTrapGroup/ndscan" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
{% end %} {% end %}
{% layout_card(title="DAX - Duke ARTIQ extensions", sameheight=120) %}
<small>A library to provide tools for system organization/abstraction and to improve usability by automating common functionality.</small>
<a href="https://gitlab.com/duke-artiq" target="_blank" rel="noopener noreferrer" itemprop="url">Repositories</a>
{% end %}
{% layout_card(title="flake8-artiq", sameheight=120) %}
<small>A Flake8 plugin for checking ARTIQ code</small>
<a href="https://gitlab.com/duke-artiq/flake8-artiq" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
{% end %}
{% layout_card(title="Oxford routines", sameheight=120) %} {% layout_card(title="Oxford routines", sameheight=120) %}
<small>Oxford Ion-Trap Group routines</small> <small>Oxford Ion-Trap Group routines</small>
@ -157,12 +146,6 @@ We welcome inquiries from research groups of all sizes.<br>[See what has been fu
<a href="https://github.com/OxfordIonTrapGroup/oitg" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a> <a href="https://github.com/OxfordIonTrapGroup/oitg" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
{% end %} {% end %}
{% layout_card(title="ATOMIQ", sameheight=120) %}
<small>An abstraction layer to move hardware specific information into a configuration layer and enables working with generic software objects representing the actual hardware in the lab.</small>
<a href="https://thequantumlaend.de/2024/03/07/atomiq-our-convenience-layer-for-artiq-now-available/" target="_blank" rel="noopener noreferrer" itemprop="url">Announcement</a> | <a href="https://gitlab.com/atomiq-project/atomiq" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
{% end %}
{% layout_card(title="UCLA routines", sameheight=120) %} {% layout_card(title="UCLA routines", sameheight=120) %}
<small>ARTIQ experiments in use at UCLA AMO</small> <small>ARTIQ experiments in use at UCLA AMO</small>
@ -187,12 +170,25 @@ We welcome inquiries from research groups of all sizes.<br>[See what has been fu
<a href="https://github.com/cnourshargh/Bham-ARTIQ-examples" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a> <a href="https://github.com/cnourshargh/Bham-ARTIQ-examples" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
{% end %} {% end %}
{% layout_card(title="DAX - Duke ARTIQ extensions", sameheight=120) %}
<small>A library to provide tools for system organization/abstraction and to improve usability by automating common functionality.</small>
<a href="https://gitlab.com/duke-artiq" target="_blank" rel="noopener noreferrer" itemprop="url">Repositories</a>
{% end %}
{% layout_card(title="Argent", sameheight=120) %} {% layout_card(title="Argent", sameheight=120) %}
<small>High-level sequence control interface for ARTIQ.</small> <small>High-level sequence control interface for ARTIQ.</small>
<a href="https://github.com/robertfasano/argent" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a> <a href="https://github.com/robertfasano/argent" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
{% end %} {% end %}
{% layout_card(title="flake8-artiq", sameheight=120) %}
<small>A Flake8 plugin for checking ARTIQ code</small>
<a href="https://gitlab.com/duke-artiq/flake8-artiq" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
{% end %}
{% layout_card(title="GenericSCPIDriver", sameheight=120) %} {% layout_card(title="GenericSCPIDriver", sameheight=120) %}
<small>A generic Python driver for SCPI devices driven over serial connections. Compatible with ARTIQ.</small> <small>A generic Python driver for SCPI devices driven over serial connections. Compatible with ARTIQ.</small>

6
package-lock.json generated
View File

@ -2815,9 +2815,9 @@
"dev": true "dev": true
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001690", "version": "1.0.30001696",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz",
"integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", "integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {

View File

@ -56,13 +56,6 @@
background-size: cover; background-size: cover;
} }
.card-featured {
background: #fff url("../images/fireworks-phone@2x.png") no-repeat top center;
background-size: contain;
}
.card-featured > div {
padding-top: 66.64%;
}
.card-artiq { .card-artiq {
background: #fff url("../images/artiq-phone@2x.png") no-repeat top center; background: #fff url("../images/artiq-phone@2x.png") no-repeat top center;
@ -129,10 +122,6 @@ img.kf25 {
// Small devices (landscape phones, 576px and up) // Small devices (landscape phones, 576px and up)
@media (min-width: 576px) { @media (min-width: 576px) {
.card-featured > div {
padding-top: 0;
}
.card-artiq > div { .card-artiq > div {
padding-top: 0; padding-top: 0;
} }
@ -224,11 +213,6 @@ img.kf25 {
box-shadow: 0 .5rem 1rem rgba(0,0,0,.15)!important; box-shadow: 0 .5rem 1rem rgba(0,0,0,.15)!important;
} }
.card-featured {
background: #fff url("../images/fireworks@2x.png") no-repeat top right;
}
.card-artiq { .card-artiq {
background: #fff url("../images/artiq@2x.png") no-repeat top right; background: #fff url("../images/artiq@2x.png") no-repeat top right;
} }

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 KiB

File diff suppressed because one or more lines are too long

View File

@ -480,7 +480,7 @@ const useCart = ((set, get) => ({
let itemsCopy = Array.from(crate.items); let itemsCopy = Array.from(crate.items);
const disabled = !!get().crateParams(crate.crate_mode).warnings_disabled; const disabled = !!get().crateParams(crate.crate_mode).warnings_disabled;
itemsCopy = FillResources(itemsCopy, disabled); itemsCopy = FillResources(itemsCopy, disabled);
itemsCopy = TriggerWarnings(itemsCopy, disabled); itemsCopy = TriggerWarnings(itemsCopy, disabled, crate);
const [crate_warnings, occupied] = TriggerCrateWarnings(crate); const [crate_warnings, occupied] = TriggerCrateWarnings(crate);
return { return {
...crate, ...crate,

View File

@ -30,14 +30,14 @@ const find_next_source_index = (data, index, source) => {
} }
const not_enough_resource_trigger = (name) => { const not_enough_resource_trigger = (name) => {
return (_data, _index, counters) => { return (_data, _index, counters, _crate) => {
const resource = find_in_counters(counters, name); const resource = find_in_counters(counters, name);
return resource.occupied > resource.max; return resource.occupied > resource.max;
} }
} }
const no_source_trigger = (name) => { const no_source_trigger = (name) => {
return (data, index, _counters) => { return (data, index, _counters, _crate) => {
const occupied = item_occupied_counters[name](data[index]); const occupied = item_occupied_counters[name](data[index]);
if (occupied > 0) if (occupied > 0)
return !find_previous_source(data, index, name); return !find_previous_source(data, index, name);
@ -46,12 +46,20 @@ const no_source_trigger = (name) => {
} }
const wiring_constraint = (name) => { const wiring_constraint = (name) => {
return (data, index, _counters) => { return (data, index, _counters, _crate) => {
const next = find_next_source_index(data, index, name); const next = find_next_source_index(data, index, name);
return next - index === 1; return next - index === 1;
} }
} }
const phaser_next_card_long = (data, index, counters, crate) => {
const nbrOccupied = resource_counters.hp(crate.items, -1);
const nbrHP = useShopStore.getState().crateParams(crate.crate_mode).hp;
return (index < data.length - 1) ? (
(data[index+1].consumes && data[index+1].consumes.depth && data[index+1].consumes.depth >= 8.5)
) : (nbrOccupied >= nbrHP && nbrHP > 0)
}
const Types = { const Types = {
"eem_resource": { "eem_resource": {
level: "warning", level: "warning",
@ -88,22 +96,27 @@ const Types = {
trigger: wiring_constraint("eem"), trigger: wiring_constraint("eem"),
message: "Due to wiring constraints, the carrier can only connect to EEM cards immediately at its right, without crossing another carrier." message: "Due to wiring constraints, the carrier can only connect to EEM cards immediately at its right, without crossing another carrier."
}, },
"phaser_next_card_long": {
level: "reminder",
trigger: phaser_next_card_long,
message: "The next card may interfere with this Phaser. Consider placing a shorter card right after this Phaser."
},
"default": { "default": {
level: "warning", level: "warning",
trigger: (_a, _b, _c) => { trigger: (_a, _b, _c, _d) => {
return true; return true;
}, },
message: 'This item has unimplemented warning' message: 'This item has unimplemented warning'
} }
} }
export function TriggerWarnings(data, disabled) { export function TriggerWarnings(data, disabled, crate) {
return data.map((element, index) => { return data.map((element, index) => {
if (!element.warnings) return element; if (!element.warnings) return element;
element.show_warnings = disabled ? [] :element.warnings element.show_warnings = disabled ? [] :element.warnings
.map((warning, _) => { .map((warning, _) => {
if (!!Types[warning]) if (!!Types[warning])
return Types[warning].trigger(data, index, element.counted_resources) ? {trigger: undefined, name: warning, ...Types[warning]} : null; return Types[warning].trigger(data, index, element.counted_resources, crate) ? {trigger: undefined, name: warning, ...Types[warning]} : null;
else else
return Types.default; return Types.default;
}) })
@ -143,6 +156,22 @@ const crate_warnings = {
const nbrHPDesktop = useShopStore.getState().crate_modes.desktop.hp; const nbrHPDesktop = useShopStore.getState().crate_modes.desktop.hp;
return crate.crate_mode === useShopStore.getState().crate_modes.rack.id && occupied < nbrHPDesktop; return crate.crate_mode === useShopStore.getState().crate_modes.rack.id && occupied < nbrHPDesktop;
} }
},
"phaser_not_fit": {
message: "Phaser cards require additional space immediately after them, but the current crate lacks sufficient room. This may disrupt placement of subsequent cards. Consider removing cards, repositioning shorter cards after Phaser(s), or using a larger crate.",
level: "warning",
trigger: (crate, occupied) => {
const nbrHP = useShopStore.getState().crateParams(crate.crate_mode).hp;
const stacked_phasers = crate.items.filter((elem, index, data) => {
return (elem.name_codename === "Phaser") && ((index < data.length - 1) ? (
(data[index + 1].consumes && data[index + 1].consumes.depth && data[index + 1].consumes.depth >= 8.5)
) : (occupied >= nbrHP && nbrHP > 0))
}
).length;
// #!debug
console.log(stacked_phasers, occupied)
return stacked_phasers > 0 && (occupied + stacked_phasers*2 >= nbrHP) && nbrHP >0;
}
} }
} }

View File

@ -229,7 +229,8 @@ const shop_data = {
"eem_wiring_constraint" "eem_wiring_constraint"
], ],
consumes: { consumes: {
hp: 8 hp: 8,
depth: 20
} }
}, },
'kaslisoc': { 'kaslisoc': {
@ -307,7 +308,8 @@ const shop_data = {
"eem_wiring_constraint" "eem_wiring_constraint"
], ],
consumes: { consumes: {
hp: 8 hp: 8,
depth: 20
} }
}, },
'vhdcicarrier': { 'vhdcicarrier': {
@ -332,7 +334,8 @@ const shop_data = {
"eem_wiring_constraint" "eem_wiring_constraint"
], ],
consumes: { consumes: {
hp: 8 hp: 8,
depth: 16
} }
}, },
'bnc-dio': { 'bnc-dio': {
@ -403,7 +406,8 @@ const shop_data = {
], ],
consumes: { consumes: {
hp: 8, hp: 8,
eem: 1 eem: 1,
depth: 7
} }
}, },
'sma-dio': { 'sma-dio': {
@ -468,7 +472,8 @@ const shop_data = {
], ],
consumes: { consumes: {
hp: 4, hp: 4,
eem: 1 eem: 1,
depth: 7
} }
}, },
'mcx-dio': { 'mcx-dio': {
@ -559,7 +564,8 @@ const shop_data = {
], ],
consumes: { consumes: {
hp: 4, hp: 4,
eem: 2 eem: 2,
depth: 23
} }
}, },
'rj45-dio': { 'rj45-dio': {
@ -645,7 +651,8 @@ const shop_data = {
], ],
consumes: { consumes: {
hp: 4, hp: 4,
eem: 2 eem: 2,
depth: 7
} }
}, },
'urukul': { 'urukul': {
@ -710,7 +717,8 @@ const shop_data = {
consumes: { consumes: {
hp: 4, hp: 4,
eem: 2, eem: 2,
clk: 1 clk: 1,
depth: 16
} }
}, },
'urukul_4412': { 'urukul_4412': {
@ -748,7 +756,8 @@ const shop_data = {
consumes: { consumes: {
hp: 4, hp: 4,
eem: 2, eem: 2,
clk: 1 clk: 1,
depth: 16
} }
}, },
'phaser': { 'phaser': {
@ -777,12 +786,14 @@ const shop_data = {
size: 'small', size: 'small',
warnings: [ warnings: [
"no_eem_source", "no_eem_source",
"no_clk_source" "no_clk_source",
"phaser_next_card_long"
], ],
consumes: { consumes: {
hp: 4, hp: 4,
eem: 1, eem: 1,
clk: 1 clk: 1,
depth: 16 // heatsink 8.5
} }
}, },
'zotino': { 'zotino': {
@ -824,7 +835,8 @@ const shop_data = {
consumes: { consumes: {
hp: 4, hp: 4,
eem: 1, eem: 1,
tec: 1 tec: 1,
depth: 16
}, },
resources: [ resources: [
{name: "idc", max: 4} {name: "idc", max: 4}
@ -852,7 +864,8 @@ const shop_data = {
], ],
consumes: { consumes: {
hp: 4, hp: 4,
eem: 1 eem: 1,
depth: 17
}, },
resources: [ resources: [
{name: "idc", max: 4} {name: "idc", max: 4}
@ -878,7 +891,8 @@ const shop_data = {
], ],
consumes: { consumes: {
hp: 8, hp: 8,
idc: 1 idc: 1,
depth: 6
} }
}, },
'hvamp32': { 'hvamp32': {
@ -901,9 +915,13 @@ const shop_data = {
warnings: [ warnings: [
"no_idc_source" "no_idc_source"
], ],
resources: [
{name: "idc", max: 4}
],
consumes: { consumes: {
hp: 4, hp: 4,
idc: 4 idc: 4,
depth: 16
} }
}, },
'idc-sma-adapter': { 'idc-sma-adapter': {
@ -926,7 +944,8 @@ const shop_data = {
], ],
consumes: { consumes: {
hp: 4, hp: 4,
idc: 1 idc: 1,
depth: 6
} }
}, },
'idc-mcx-adapter': { 'idc-mcx-adapter': {
@ -971,7 +990,8 @@ const shop_data = {
"idc_resource" "idc_resource"
], ],
consumes: { consumes: {
hp: 4 hp: 4,
depth: 5
}, },
resources: [ resources: [
{name: "idc", max: 4} {name: "idc", max: 4}
@ -1026,7 +1046,8 @@ const shop_data = {
], ],
consumes: { consumes: {
hp: 8, hp: 8,
eem: 2 eem: 2,
depth: 16
} }
}, },
'koster': { 'koster': {
@ -1052,7 +1073,8 @@ const shop_data = {
], ],
consumes: { consumes: {
hp: 4, hp: 4,
eem: 2 eem: 2,
depth: 7.5
} }
}, },
'clocker': { 'clocker': {
@ -1085,7 +1107,8 @@ const shop_data = {
consumes: { consumes: {
hp: 4, hp: 4,
eem: 1, eem: 1,
clk: 1 clk: 1,
depth: 7
}, },
resources: [ resources: [
{name: "clk", max: 6} {name: "clk", max: 6}
@ -1122,7 +1145,8 @@ const shop_data = {
], ],
consumes: { consumes: {
hp: 4, hp: 4,
eem: 1 eem: 1,
depth: 16
}, },
}, },
'fast_servo': { 'fast_servo': {
@ -1156,7 +1180,8 @@ const shop_data = {
], ],
consumes: { consumes: {
hp: 4, hp: 4,
eem: 1 eem: 1,
depth: 16
}, },
}, },
'mirny': { 'mirny': {
@ -1189,7 +1214,8 @@ const shop_data = {
consumes: { consumes: {
hp: 4, hp: 4,
eem: 1, eem: 1,
clk: 1 clk: 1,
depth: 16
}, },
}, },
'almazny': { 'almazny': {
@ -1217,7 +1243,8 @@ const shop_data = {
consumes: { consumes: {
hp: 8, hp: 8,
eem: 1, eem: 1,
clk: 1 clk: 1,
depth: 16
}, },
}, },
'thermostat-eem': { 'thermostat-eem': {
@ -1245,6 +1272,7 @@ const shop_data = {
consumes: { consumes: {
hp: 4, hp: 4,
eem: 1, eem: 1,
depth: 16
} }
}, },
'thermostat2ch': { 'thermostat2ch': {
@ -1263,7 +1291,8 @@ const shop_data = {
], ],
size: 'small', size: 'small',
consumes: { consumes: {
hp: 4 hp: 4,
depth: 12
}, },
resources: [ resources: [
{name: "tec", max: 2} {name: "tec", max: 2}
@ -1292,7 +1321,8 @@ const shop_data = {
consumes: { consumes: {
hp: 8, hp: 8,
eem: 1, eem: 1,
clk: 1 clk: 1,
depth: 8
}, },
}, },
'pounder': { 'pounder': {
@ -1326,7 +1356,8 @@ const shop_data = {
consumes: { consumes: {
hp: 8, hp: 8,
eem: 1, eem: 1,
clk: 1 clk: 1,
depth: 16
} }
}, },
'eem_pwr_mod': { 'eem_pwr_mod': {
@ -1351,6 +1382,7 @@ const shop_data = {
warnings: [], warnings: [],
consumes: { consumes: {
hp: 8, hp: 8,
depth: 20
}, },
}, },
'kirdy': { 'kirdy': {
@ -1382,6 +1414,7 @@ const shop_data = {
warnings: [], warnings: [],
consumes: { consumes: {
hp: 8, hp: 8,
depth: 16
}, },
}, },
}, },

View File

@ -35,42 +35,6 @@
<div class="row"> <div class="row">
<div class="col-12">
<div class="card shadow mt-3 mb-3" itemscope itemtype="https://schema.org/Poster">
<div class="card-body p-3 p-md-5 card-featured">
<div class="col-12 col-md-6 ps-0 pe-0">
<h5 class="card-title" itemprop="headline">News</h5>
<div class="desc-wrapper" itemprop="description">
<p class="card-text pt-3">
The Sinara 1550 Kirdy is a laser diode driver which combines a low-noise current source and a precision temperature controller. In combination with Fast-Servo, it can lock lasers to spectral lines and reference cavities. See <a href="docs/kirdybrochure.pdf">the brochure</a>.
</p>
<p class="card-text pt-3">
The world's <a href="https://www.ox.ac.uk/news/2025-02-06-first-distributed-quantum-algorithm-brings-quantum-supercomputers-closer">first distributed quantum algorithm experiment</a> was performed at Oxford University using ARTIQ. See <a href="https://www.nature.com/articles/s41586-024-08404-x">the paper</a>.
</p>
<p class="card-text pt-3">
The Sinara 5716 Shuttler is a 16-channel 125MSPS 14-bit DAC optimized for trapped ion shuttling. More information in the <a href="https://forum.m-labs.hk/d/745-artiq-8-released">ARTIQ-8 release announcement</a>.
</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row pb-5">
<div class="col-12"> <div class="col-12">
<div class="card shadow mt-3 mb-3" itemscope itemtype="https://schema.org/Poster"> <div class="card shadow mt-3 mb-3" itemscope itemtype="https://schema.org/Poster">