Hardware Control

Since QDNS designed to do the simulation dynamically, it gaves the user control over all the hardware of device. Users can make any changes they want on the socket or the host device during the simulation phase.

Some useful socket commands used as below by Alice:

class Alice(QDNS.Node):
    def __init__(self):
        super().__init__("Alice")
        self.create_new_application(self.alice_default_app)

    @staticmethod
    def alice_default_app(default_app: QDNS.Application, *user_args):
        # Returns QDNS.SocketInformation
        print(default_app.reveal_socket_information())

        # Returns QDNS.PortInformation
        print(default_app.reveal_port_information(0, search_quantum=True))

        # Returns QDNS.ConnectivityInformation
        print(default_app.reveal_connectivity_information())

        # Open/ close communication.
        default_app.open_communication()
        default_app.close_communication()

        # Activate/ deactivate port.
        default_app.activate_port(0, search_quantum=True)
        default_app.deactivate_port(0, search_quantum=True)

        # Pause/ resume networking.
        default_app.pause_socket()
        default_app.resume_socket()

        # Terminate socket. !No return.
        default_app.terminate_socket()

        # Unconnect channel.
        default_app.unconnect_channel(0, search_quantum=True)

        # Flushes route data on routig layer of device.
        default_app.flush_route_data()

        # Ends host device simulation.
        # Other applications in same device will terminate.
        default_app.end_device_simulation()

Full Example

Full example with outputs:

import QDNS
import logging

class Alice(QDNS.Node):
    def __init__(self):
        super().__init__("Alice")
        self.create_new_application(self.alice_default_app)

    @staticmethod
    def alice_default_app(default_app: QDNS.Application, *user_args):
        # Returns QDNS.SocketInformation
        print(default_app.reveal_socket_information())

        # Returns QDNS.PortInformation
        print(default_app.reveal_port_information(0, search_quantum=True))

        # Returns QDNS.ConnectivityInformation
        print(default_app.reveal_connectivity_information())

        # Open/ close communication.
        default_app.open_communication()
        default_app.close_communication()

        # Activate/ deactivate port.
        default_app.activate_port(0, search_quantum=True)
        default_app.deactivate_port(0, search_quantum=True)

        # Pause/ resume networking.
        default_app.pause_socket()
        default_app.resume_socket()

        # Terminate socket. !No return.
        default_app.terminate_socket()

        # Unconnect channel.
        default_app.unconnect_channel(0, search_quantum=True)

        # Flushes route data on routig layer of device.
        default_app.flush_route_data()

        # Ends host device simulation.
        # Other applications in same device will terminate.
        default_app.end_device_simulation()

class Bob(QDNS.Node):
    def __init__(self):
        super().__init__("Bob")
        self.create_new_application(self.bob_default_app)

    @staticmethod
    def bob_default_app(default_app: QDNS.Application, *user_args):
        default_app.sleep(0.1)

def main():
    logging.basicConfig(level=logging.WARNING)

    alice = Alice()
    bob = Bob()
    net = QDNS.Network(alice, bob)
    net.add_channels(alice, bob)

    frames = {
        2: {
            1: 128,
            2: 64,
            3: 32,
            4: 16
        },

        3: {
            2: 8
        }

    }
    conf = QDNS.BackendConfiguration(QDNS.CIRQ_BACKEND, 1, frames)
    sim = QDNS.Simulator()
    sim.simulate(net, conf)

if __name__ == '__main__':
    main()
WARNING:QDNS::Kernel::Backend:CIRQ backend is prepaired for simulation. Prepairation time: ~0.0993 sec

Socket state: "socket up"
Device Identifier: Alice, ebc414f6-7108-4d70-92c1-64dfe68fcf67
Auto Ping: True
Ping Time: 2.5
Enable Routing: True

Port Manager of Alice
Classic Port Capacity: 8
Quantum Port Capacity: 8
Classic Port Count: 8
Quantum Port Count: 8
Connected Classic Port Count: 1
Connected Quantum Port Count: 1
Communication State: "communication is up"
Port used counts: {'C0': 4, 'C1': 0, 'C2': 0, 'C3': 0,
                   'C4': 0, 'C5': 0, 'C6': 0, 'C7': 0,
                   'Q0': 2, 'Q1': 0, 'Q2': 0, 'Q3': 0,
                   'Q4': 0, 'Q5': 0, 'Q6': 0, 'Q7': 0}

Index: 0
Type: Classic port type
Active: True
Connected: True
Target: Bob, a42b2541-ecca-40ef-a3e3-f605a1c47244
Latency: 0.00034

Classic UUIDs: ['L1MT3GPERSEUA1GF']
Quantum UUIDs: ['Q448570NC7I1O5VO']
Classic Targets: ['Bob']
Quantum Targets: ['Bob']
Communication State: True

WARNING:QDNS::Alice::Socket:Socket of device Alice is terminating.